我正在使用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 } };
最佳答案
首先,免责声明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
!虽然像《星际迷航》中那样传送一些硬件会很好,但是在当前版本的SYCL中,尚不可能通过管道发送实际的硬件。 :-)像您这样的代码可能可以工作,但是具有真正的管道数组。
但是问题是管道需要在施工时指定一些尺寸...
我可能想到的一些想法是
float
和执行std::vector<cl::sycl::pipe<float>> p
的循环n_threads
。或者,您可以使用一些元编程(Boost.Hana可能会帮助...)从
p.emplace_back(T)
的初始化列表std::array<cl::sycl::pipe<float>>
构造n_threads
。或者,您可以使用具有默认构造的中间对象来执行您感兴趣的管道。
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
关于c++ - 有没有办法创建cl::sycl::pipe数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48631519/