首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用dpc++从sycl程序创建静态或共享库

使用dpc++从sycl程序创建静态或共享库
EN

Stack Overflow用户
提问于 2021-06-28 06:28:48
回答 1查看 447关注 0票数 0

我试图从sycl程序创建一个静态或共享库,并使用gcc/g++/clang++在主应用程序构建中使用它。如果我使用dpcpp构建我的主要应用程序,一切都很好,但我需要使用g++。

例如,我的示例sycl_lib.cpp和主程序如下。

代码语言:javascript
复制
//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;
}

要创建静态库并使用它:

代码语言:javascript
复制
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,它会导致运行时错误。

代码语言:javascript
复制
g++ main.cpp sycl_lib.a -L$SYSL_DIR/lib -lsycl
./a.out

,这将导致以下错误

代码语言:javascript
复制
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库吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-14 16:32:22

简单回答是:虽然任何编译器都可以用于主机代码,但是必须使用dpcpp来创建最终的二进制文件(做链接),因为只有dpcpp知道这是一个SYCL程序

我们这样做的方法是:

代码语言:javascript
复制
$ g++ main.cpp sycl_lib.a -L$SYSL_DIR/lib -lsycl

使用

代码语言:javascript
复制
$ g++ -c main.cpp
$ dpcpp main.o sycl_lib.a -L$SYSL_DIR/lib -lsycl

我们一定要更好地记录这件事-抱歉。我会看看我们能在那里做些什么(建议会很感激)。

原因如下:您可以用g++编译任何主机代码,但是要完成SYCL程序并创建g++不知道的最终二进制(将主机代码和非主机代码结合在一起),就需要最后完成。dpcpp调用“sycl-post-link”--我们只使用dpcpp构建最终的二进制文件就可以得到这个链接。

下面是文件和Makefile来说明的:

代码语言:javascript
复制
//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编译器文档小组讨论如何清楚地记录这一点。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68158506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档