调试OpenCL内核的最佳方法

时间:2019-03-13 01:02:52

标签: c++ debugging opencl heterogeneous

我有以下要调试的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);

                   }

                 }

我也尝试过在barrier(CLK_LOCAL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE);之前和之后进行呼叫printf,但这没有用。 有人可以建议我以序列化工作项执行的方式来打印和调试内核吗?或其他更好的方法来调试OpenCL内核。我正在使用RX 580 AMD GPU。

1 个答案:

答案 0 :(得分:2)

一些建议: 您可以使用全局ID和组ID来控制要打印的线程,并且在打印时还可以打印出线程和组ID。这将大大降低打印信息的复杂性,并使您可以更好地控制所需的信息。

另一个提示是,如果可能,请尝试将多个打印分为一个打印;例如,如果我们按以下方式使用print,那不是一个好的调试方法

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

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

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

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

最好将它们全部打印一次,以避免它们被其他线程的其他打印交错。

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