1

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

4

1 回答 1

3

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

另一个提示是,如果可能,请尝试将多个打印件组合成一个;例如,如果我们按如下方式使用 print 就不是一个好的调试方法

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

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

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

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

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

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

于 2019-03-14T03:46:19.727 回答