【问题标题】:How to print inside SYCL parallel_for (kernel)?如何在 SYCL parallel_for(内核)中打印?
【发布时间】:2019-11-27 06:28:38
【问题描述】:

我正在开发与 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 dpc++ intel-oneapi


    【解决方案1】:

    使用 sycl::stream 类在 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
        });
    

    【讨论】:

      【解决方案2】:

      否则您可以只使用主机设备先调试您的程序。 在主机设备上,您应该能够使用您想要的任何 C++ 代码。 您甚至可以使用 GDB、Valgrind、Helgrind、UBsan 等普通主机调试工具来调试包括内核代码在内的应用程序。

      在主机设备上调试内核后,从内核中删除或注释主机专用调试代码并切换到真正的加速器设备。

      【讨论】:

        猜你喜欢
        • 2022-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-29
        • 2011-11-25
        • 1970-01-01
        • 1970-01-01
        • 2023-02-18
        相关资源
        最近更新 更多