有没有办法可以创建一个 cl::sycl::pipe 数组?

Posted

技术标签:

【中文标题】有没有办法可以创建一个 cl::sycl::pipe 数组?【英文标题】:Is there a way I can create an array of cl::sycl::pipe? 【发布时间】:2018-02-05 21:10:04 【问题描述】:

我正在使用 Xilinx 的 triSYCL github 实现,https://github.com/triSYCL/triSYCL。

我正在尝试创建一个包含 100 个 cl::sycl::pipes 的设计,每个 capacity= 6。我将通过 SYCL 代码中的单独线程访问每个管道。

这是我尝试过的:

constexpr int T = 6;
constexpr int n_threads = 100;

cl::sycl::pipe<cl::sycl::pipe<float>> p  n_threads, cl::sycl::pipe<float>  T  ;

for (int j=0; j<n_threads; j++) 
    q.submit([&](cl::sycl::handler &cgh) 
      // Get write access to the pipe
      auto kp = p[j].get_access<cl::sycl::access::mode::write>(cgh);
      // Get read access to the data
      auto ba = A.get_access<cl::sycl::access::mode::read>(cgh);

      cgh.single_task<class producer>([=] () mutable 
          for (int i = 0; i != T; i++)
            // Try to write to the pipe up to success
            while (!kp.write(ba[i]));
        );
;

代码只是 github 存储库上tests/pipe/pipe_producer_consumer.cpp 文件的副本。我刚刚在其上添加了一个for loop 以并行实例化多个线程。

我收到多个错误:error: no matching function for call to ‘cl::sycl::pipe<cl::sycl::pipe<float> >::pipe(<brace-enclosed initializer list>)’ cl::sycl::pipe<cl::sycl::pipe<float>> p n_threads, cl::sycl::pipe<float> T ;

【问题讨论】:

【参考方案1】:

首先,免责声明 cl::sycl::pipe 是临时 SYCL 2.2 规范中的实验性产品,仅在 CPU(无加速器,无 FPGA...)上运行,并且仅以非常低效的方式运行。

当然,试验一下实际设计的工作原理以及 SYCL 的工作原理是很有用的。

管道类似于某些硬件 FIFO。

你写的

cl::sycl::pipe<cl::sycl::pipe<float>> p  n_threads, cl::sycl::pipe<float>  T  ;

这意味着cl::sycl::pipe 转移一些... cl::sycl::pipe 转移一些float!虽然像《星际迷航》中传送一些硬件会很好,但在当前版本的 SYCL 中还不可能通过管道发送真正的硬件。 :-)

可能像您这样的代码可以工作,但需要一个真正的管道数组。 但问题是管道需要在施工时指定一些尺寸......

我能想到的一些想法是 std::vector&lt;cl::sycl::pipe&lt;float&gt;&gt; p 和循环执行 n_threads p.emplace_back(T)

或者您可以使用一些元编程(Boost.Hana 可能会有所帮助...)从 n_threads T 的初始化列表构造一个 std::array&lt;cl::sycl::pipe&lt;float&gt;&gt;

或者您可以使用具有默认构造的中间对象来执行您感兴趣的管道。

struct my_pipe : cl::sycl::pipe<float> 
  my_pipe() : pipe  T  ;
;

std::array<my_pipe, n_threads> p;

也就是说,我没试过……

此外,在考虑之后,我真的不明白为什么在 SYCL 2.2 中管道不能具有默认构造函数,因为它们只是 OpenCL 等效对象的包装器。我会将此推送给 SYCL 委员会。感谢您让 SYCL 变得更好。 :-)

如果所有这些都有意义,请发布最终的工作代码,并使用新的单元测试代码在 https://github.com/triSYCL/triSYCL 上发出拉取请求。 :-)

如果您正在查看一些使用 SYCL 进行元编程的示例,请查看 https://www.khronos.org/assets/uploads/developers/library/2017-supercomputing/Xilinx-triSYCL-complete_Nov17.pdf 幻灯片 45--49 https://www.youtube.com/watch?v=4r6FXxknJEA

【讨论】:

感谢您的回复@Ronan。我正在研究 SYCL,因此提出了很多新问题。我会尝试看看这是否有效。再次感谢。 有一个关于管道的新提案,您可能会感兴趣并有助于详细说明:github.com/intel/llvm/pull/635

以上是关于有没有办法可以创建一个 cl::sycl::pipe 数组?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法用 Cargo 创建 C 库?

有没有办法创建一个测试 adwords 客户帐户?

有没有办法使用 SWIG C++ 创建一个 python 模块,可以在 Python2 和 Python3 中导入

仅使用 numpy,有没有办法创建方波?

有没有办法直接从GLSurfaceView(OpenGL ES)创建视频文件?

有没有办法使用 cloudformation 创建 aws lambda 执行角色?