我有一个需要调试的OpenCL内核。
我在其中添加了一些printf,但这些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。