我有以下要调试的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。
答案 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);
最好将它们全部打印一次,以避免它们被其他线程的其他打印交错。
有了以上两个技巧,处理调试内核可能会更容易。