如何在 SYCL parallel_for(内核)中打印?
How to print inside SYCL parallel_for (kernel)?
我正在开发与 oneAPI basekit 一起提供的 vectorAdd 示例应用程序。当我尝试在内核中打印总和时,出现以下错误。
请查收附件源码和编译时的错误。
//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;
使用 sycl::stream class 在您的 SYCL 代码中输出日志记录。 a guide 解释了如何执行此操作。
您的代码应如下所示
//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 等来调试包括内核代码在内的应用程序。
在主机设备上调试内核后,从内核中删除或注释仅主机调试代码并切换到真正的加速器设备。
我正在开发与 oneAPI basekit 一起提供的 vectorAdd 示例应用程序。当我尝试在内核中打印总和时,出现以下错误。
请查收附件源码和编译时的错误。
//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;
使用 sycl::stream class 在您的 SYCL 代码中输出日志记录。 a guide 解释了如何执行此操作。
您的代码应如下所示
//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 等来调试包括内核代码在内的应用程序。
在主机设备上调试内核后,从内核中删除或注释仅主机调试代码并切换到真正的加速器设备。