Как печатать внутри SYCL parallel_for (ядро)?

Я работаю над примером приложения vectorAdd, которое было предоставлено вместе с базовым пакетом oneAPI. Когда я попытался распечатать сумму внутри ядра, я получил следующую ошибку.

Пожалуйста, найдите приложенный исходный код и ошибку при компиляции.

//Source code 

    cgh.parallel_for<class VectorAdd>(num_items, [=](id<1> wiID) {
        sum_accessor[wiID] = addend_1_accessor[wiID] + addend_2_accessor[wiID];

        std::cout<<"Sum : "<<sum_accessor[wiID]<<std::endl;  // I want to print this sum

        });

Во время компиляции я получаю следующую ошибку.

 //Error generated while compiling

usr/lib/gcc/x86_64-linux-gnu/7.4.0/../../../../include/c++/7.4.0/bits/ostream.tcc:359:25: error: SYCL kernel cannot have a class with a virtual function table
  extern template class basic_ostream<char>;
                        ^
vector-add.cpp:159:6: note: used here
            std::cout<<"Sum : "<<sum_accessor[wiID]<<std::endl;
            ^
vector-add.cpp:159:11: error: SYCL kernel cannot use a global variable
            std::cout<<"Sum : "<<sum_accessor[wiID]<<std::endl;

2 ответа

Решение

Используйте класс sycl::stream для вывода журнала в код SYCL. Есть руководство, в котором объясняется, как это сделать.

Ваш код должен выглядеть примерно так

//Source code 
sycl::stream out(1024, 256, cgh);
cgh.parallel_for<class VectorAdd>(num_items, [=](id<1> wiID) {
    sum_accessor[wiID] = addend_1_accessor[wiID] + addend_2_accessor[wiID];
    out << "Sum : " << sum_accessor[wiID]  << cl::sycl::endl;  // I want to print this sum
    });

В противном случае вы можете просто использовать хост-устройство для отладки вашей программы. На главном устройстве вы должны иметь возможность использовать любой код C++, который хотите. Вы даже можете использовать обычные инструменты отладки хоста, такие как GDB, Valgrind, Helgrind, UBsan и т. Д., Для отладки приложения, включая код ядра.

После того, как ядро ​​отлажено на хост-устройстве, удалите или закомментируйте код отладки только для хоста из ядра и переключитесь на реальное устройство-ускоритель.

Другие вопросы по тегам