有什么方法可以创建 cl::sycl::pipe 的数组吗?
Is there a way I can create an array of cl::sycl::pipe?
我正在使用 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 } };
首先,关于 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 可能有帮助...)从 n_threads
T
.[=25 的初始化列表构造一个 std::array<cl::sycl::pipe<float>>
=]
或者您可以使用具有默认构造的中间对象来完成您感兴趣的管道。
struct my_pipe : cl::sycl::pipe<float> {
my_pipe() : pipe { T } {};
};
std::array<my_pipe, n_threads> p;
也就是说,我没试过...
此外,在考虑之后,我真的不明白为什么在 SYCL 2.2 中管道不能有默认构造函数,因为它们只是 OpenCL 等效对象的包装器。我会把这个推给 SYCL 委员会。感谢您让 SYCL 变得更好。 :-)
如果所有这些都有意义,请 post 最终工作代码并使用新的单元测试代码在 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
我正在使用 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 } };
首先,关于 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 可能有帮助...)从 n_threads
T
.[=25 的初始化列表构造一个 std::array<cl::sycl::pipe<float>>
=]
或者您可以使用具有默认构造的中间对象来完成您感兴趣的管道。
struct my_pipe : cl::sycl::pipe<float> {
my_pipe() : pipe { T } {};
};
std::array<my_pipe, n_threads> p;
也就是说,我没试过...
此外,在考虑之后,我真的不明白为什么在 SYCL 2.2 中管道不能有默认构造函数,因为它们只是 OpenCL 等效对象的包装器。我会把这个推给 SYCL 委员会。感谢您让 SYCL 变得更好。 :-)
如果所有这些都有意义,请 post 最终工作代码并使用新的单元测试代码在 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