如何解决使用 dpc++
我正在尝试从 sycl 程序创建静态或共享库,并从使用 gcc/g++/clang++ 的主应用程序构建中使用它。 如果我使用 dpcpp 来构建我的主应用程序,一切都很好,但我需要使用 g++。
比如我的示例sycl_lib.cpp和主程序如下。
//sycl_lib.cpp
#include<CL/sycl.hpp>
int func() {
q.submit([&](sycl::handler &h) {
sycl::stream os(1024,768,h);
h.parallel_for(32,[=](sycl::id<1> i) {
os<<i<<"\n";
});
});
}
//main.cpp
void func();
int main() {
func();
return 0;
}
创建静态库并使用它:
dpcpp -c sycl_lib.cpp -fPIC
ar rvs sycl_lib.a sycl_lib.o
dpcpp main.cpp sycl_lib.a
./a.out
这很好用。但是我想用g++来构建main.cpp,导致运行时错误。
g++ main.cpp sycl_lib.a -L$SYSL_DIR/lib -lsycl
./a.out
出现以下错误
terminate called after throwing an instance of 'cl::sycl::runtime_error'
what(): No kernel named _ZTSZZ4funcvENKUlRN2cl4sycl7handlerEE6_12clES2_EUlNS0_2idILi1EEEE8_24 was found -46 (CL_INVALID_KERNEL_NAME)
Aborted
用 g++ 创建的可执行文件是否可以使用用 dpc++ 创建的 sycl 库?
谢谢
解决方法
简短的回答是:虽然任何编译器都可用于宿主代码,但必须使用 dpcpp 来创建最终的二进制文件(执行链接),因为只有 dpcpp 知道这是一个SYCL 程序。
我们通过替换:
$ g++ main.cpp sycl_lib.a -L$SYSL_DIR/lib -lsycl
与
$ g++ -c main.cpp
$ dpcpp main.o sycl_lib.a -L$SYSL_DIR/lib -lsycl
我们肯定需要更好地记录这一点 - 对此感到抱歉。我会看看我们能在那里做什么(建议将不胜感激)。
原因如下: 您可以使用 g++ 编译任何宿主代码,但需要完成最终确定以完成 SYCL 程序并创建 g++ 一无所知的最终二进制文件(将宿主代码和非宿主代码结合在一起)。 dpcpp 调用“sycl-post-link”——我们只需使用 dpcpp 来构建最终的二进制文件
以下是用于说明的文件和 Makefile:
//main.cpp
void func();
int main() {
func();
return 0;
}
//sycl_lib.cpp
#include<CL/sycl.hpp>
using namespace sycl;
void func() {
queue q;
q.submit([&](sycl::handler &h) {
sycl::stream os(1024,768,h);
h.parallel_for(32,[=](sycl::id<1> i) {
os<<i<<"\n";
});
});
}
# Makefile
runG: sycl_lib.a
g++ -c main.cpp
dpcpp -o runG main.o sycl_lib.a -L$SYSL_DIR/lib -lsycl
./runG
FAILrunG: sycl_lib.a
g++ -o runG main.cpp sycl_lib.a -L$SYSL_DIR/lib -lsycl
./runG
sycl_lib.a: sycl_lib.cpp
dpcpp -c sycl_lib.cpp -fPIC
ar rvs sycl_lib.a sycl_lib.o
dpcpp -o runD main.cpp sycl_lib.a
./runD
感谢您指出这一点。我已在 book errata 中添加了一般性注释,我将与 dpcpp 编译器文档团队讨论我们如何清楚地记录这一点.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。