【问题标题】:Best way to debug OpenCL Kernel调试 OpenCL 内核的最佳方法
【发布时间】:2019-08-03 14:20:30
【问题描述】:

我有以下想要调试的 openCL 内核。 我在其中放了一些 printf ,但这些都没有用,因为工作项目是随机安排的,并且打印的值并不总是正确的。 如何让内核中的工作项串行执行以进行调试?

以下是代码

__kernel
void SampleKernel( __global float4* gVtx,  __global float4* gColor,  
                 __global float4* gDst,
                 const int cNvtx, 
                 const int4 cRes )
                 {
                   printf("nVertex : %d ", cNvtx);

                   for(int i =0 ; i < 1; i+=4)
                   {

                   printf(" %f ",  gVtx[0].x);

                   printf(" %f ",  gVtx[0].y);

                   printf(" %f ",  gVtx[0].z);

                   printf(" %f ",  gVtx[0].w);

                   }

                 }

我也尝试在printf 之前和之后拨打电话barrier(CLK_LOCAL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE);,但没有用。 有人可以建议我如何序列化工作项执行以便打印和调试内核吗?或者其他一些更好的方式来调试 OpenCL 内核。我正在使用 RX 580 AMD GPU。

【问题讨论】:

    标签: c++ debugging opencl heterogeneous


    【解决方案1】:

    一些建议: 您可以使用全局 id 和组 id 来控制打印哪个线程,并且当您打印时,还可以打印出线程和组 id。这将显着降低打印信息的复杂性,并让您更好地控制您可能需要的信息。

    另一个提示是,如果可能,请尝试将多个打印件组合成一个;比如下面这样使用print就不是一个好的调试方法

                   printf(" %f ",  gVtx[0].x);
    
                   printf(" %f ",  gVtx[0].y);
    
                   printf(" %f ",  gVtx[0].z);
    
                   printf(" %f ",  gVtx[0].w);
    

    您最好一次打印它们,以避免它们被来自其他线程的其他打印交错。

    有了以上两个技巧,调试内核可能会更容易处理。

    【讨论】:

    • 感谢这些提示。还有一件事是我可以序列化执行只是为了调试目的?
    • 串行执行的一种方法是指定 1x1 全局工作大小和 1x1 工作组大小。
    猜你喜欢
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2011-02-07
    • 1970-01-01
    相关资源
    最近更新 更多