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

时间:2018-02-05 21:10:05

标签: c++ opencl sycl

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

我正在尝试使用cl::sycl::pipes创建一个100 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 个答案:

答案 0 :(得分:3)

首先,免责声明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<cl::sycl::pipe<float>> p和循环n_threads p.emplace_back(T)

或者您可以使用某些元编程(Boost.Hana可能有帮助......)从std::array<cl::sycl::pipe<float>> n_threads的初始化列表构建T

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

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