我试图从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库吗?
谢谢
发布于 2021-07-14 16:32:22
简单回答是:虽然任何编译器都可以用于主机代码,但是必须使用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感谢您指出这一点。--我向账簿勘误添加了一个一般性说明,我将与dpcpp编译器文档小组讨论如何清楚地记录这一点。
https://stackoverflow.com/questions/68158506
复制相似问题