Есть ли способ, которым я могу создать массив cl :: sycl :: pipe?

Я использую реализацию github triSYCL Xilinx,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]));
});
};

Код является просто копией tests/pipe/pipe_producer_consumer.cpp файл в хранилище github. Я только что добавил 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! Хотя было бы неплохо передать некоторые аппаратные средства, как в Star Trek, в текущей версии 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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]