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

Posted

技术标签:

【中文标题】使用 dpc++ 从 sycl 程序创建静态或共享库【英文标题】:Create a static or shared library from sycl program using dpc++ 【发布时间】:2021-06-28 06:28:48 【问题描述】:

我正在尝试从 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 库?

谢谢

【问题讨论】:

【参考方案1】:

简短的回答是:虽然任何编译器都可以用于宿主代码,但 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 编译器文档团队讨论如何清楚地记录这一点。

【讨论】:

亲爱的詹姆斯,这就是我要找的。谢谢你的解释。

以上是关于使用 dpc++ 从 sycl 程序创建静态或共享库的主要内容,如果未能解决你的问题,请参考以下文章

oneAPI编程语言DPC++功能收入SYCL 2020最终版规范

sycl/dpc++ 访问器与内核函数对象中的 global_ptr

SYCL/DPC++ cpu 版本给出了正确的结果,但 gpu 给出了不正确的数据

在 dpc++ malloc_shared 我们可以在 2 个 gpus 之间共享一个缓冲区吗

为不同的实现编写 SYCL 代码

如何从非 DPC 应用程序获取托管配置?