C++ 调试OpenCL内核的最佳方法

C++ 调试OpenCL内核的最佳方法,c++,debugging,opencl,heterogeneous,C++,Debugging,Opencl,Heterogeneous,我想调试以下openCL内核。 我在里面放了一些printf,但是这些都没有用,因为工作项是随机的,打印的值并不总是正确的。 如何使内核中的工作项以串行方式执行以进行调试 下面是代码 __kernel void SampleKernel( __global float4* gVtx, __global float4* gColor, __global float4* gDst, const int cNvtx,

我想调试以下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);

                   }

                 }
\u内核
void SampleKernel(_global float4*gVtx,_global float4*gColor,
__全球浮动4*gDst,
const int cNvtx,
const int4(cRes)
{
printf(“nVertex:%d”,cNvtx);
对于(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);
}
}
我还尝试过设置呼叫
屏障(CLK_LOCAL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE)
printf
之前和之后,但它没有用处。 有谁能建议我序列化工作项执行的方法,以便打印和调试内核?或者其他更好的调试OpenCL内核的方法。我正在使用RX 580 AMD GPU。

一些建议: 您可以使用全局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工作组大小。