Как печатать внутри 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 и т. Д., Для отладки приложения, включая код ядра.
После того, как ядро отлажено на хост-устройстве, удалите или закомментируйте код отладки только для хоста из ядра и переключитесь на реальное устройство-ускоритель.