一切成功后,EnqueueNDRangeKernel会返回无效的内核参数吗?

时间:2014-10-23 00:35:55

标签: opencl

我有26个内核参数,我设置的方式与我现在为多个程序完成的方式相同,但EnqueueNDRangeKernel将不再运行并告诉我我传递的内核参数不正确。代码如下,然后是运行代码得到的结果。

err = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void*)&Q1cl);
errCheck("Kernel Arg Q1: ", err);
err = clSetKernelArg(kernel, 1, sizeof(cl_mem), (void*)&NtoFcl);
errCheck("Kernel Arg NtoFcl: ", err);
err = clSetKernelArg(kernel, 2, sizeof(cl_mem), (void*)&FtoNcl);
errCheck("Kernel Arg FtoNcl: ", err);
err = clSetKernelArg(kernel, 3, sizeof(cl_mem), (void*)&Drcl);
errCheck("Kernel Arg Drcl: ", err);
err = clSetKernelArg(kernel, 4, sizeof(cl_mem), (void*)&Dscl);
errCheck("Kernel Arg Dscl: ", err);
err = clSetKernelArg(kernel, 5, sizeof(cl_mem), (void*)&mapRcl);
errCheck("Kernel Arg mapR: ", err);
err = clSetKernelArg(kernel, 6, sizeof(cl_mem), (void*)&fQ1);
errCheck("Kernel Arg fQ1: ", err);
err = clSetKernelArg(kernel, 7, sizeof(cl_mem), (void*)&ffQ1);
errCheck("Kernel Arg ffQ1: ", err);
err = clSetKernelArg(kernel, 8, sizeof(cl_mem), (void*)&F1);
errCheck("Kernel Arg F1: ", err);
err = clSetKernelArg(kernel, 9, sizeof(cl_mem), (void*)&G1);
errCheck("Kernel Arg G1: ", err);
err = clSetKernelArg(kernel, 10, sizeof(cl_mem), (void*)&dQ1);
errCheck("Kernel Arg dQ1: ", err);
err = clSetKernelArg(kernel, 11, sizeof(cl_mem), (void*)&dQ1dr);
errCheck("Kernel Arg dQ1dr: ", err);
err = clSetKernelArg(kernel, 12, sizeof(cl_mem), (void*)&dQ1ds);
errCheck("Kernel Arg dQ1dr: ", err);
err = clSetKernelArg(kernel, 13, sizeof(cl_mem), (void*)&dQ1dx);
errCheck("Kernel Arg dQ1dx: ", err);
err = clSetKernelArg(kernel, 14, sizeof(cl_mem), (void*)&dQ1dy);
errCheck("Kernel Arg dQ1dy: ", err);
err = clSetKernelArg(kernel, 15, sizeof(cl_mem), (void*)&sxcl);
errCheck("Kernel Arg sxcl: ", err);
err = clSetKernelArg(kernel, 16, sizeof(cl_mem), (void*)&sycl);
errCheck("Kernel Arg sycl: ", err);
err = clSetKernelArg(kernel, 17, sizeof(cl_mem), (void*)&rxcl);
errCheck("Kernel Arg rxcl: ", err);
err = clSetKernelArg(kernel, 18, sizeof(cl_mem), (void*)&rycl);
errCheck("Kernel Arg rycl: ", err);
err = clSetKernelArg(kernel, 19, sizeof(cl_mem), (void*)&nxcl);
errCheck("Kernel Arg nxcl: ", err);
err = clSetKernelArg(kernel, 20, sizeof(cl_mem), (void*)&nycl);
errCheck("Kernel Arg nycl: ", err);
err = clSetKernelArg(kernel, 21, sizeof(cl_mem), (void*)&fluxQ1);
errCheck("Kernel Arg flux: ", err);
err = clSetKernelArg(kernel, 22, sizeof(cl_mem), (void*)&resQ1cl);
errCheck("Kernel Arg resQ1: ", err);
err = clSetKernelArg(kernel, 23, sizeof(cl_mem), (void*)&Fscalecl);
errCheck("Kernel Arg Fscalecl: ", err);
err = clSetKernelArg(kernel, 24, sizeof(cl_mem), (void*)&rk4bcl);
errCheck("Kernel Arg rk4bcl: ", err);
err = clSetKernelArg(kernel, 25, sizeof(cl_double), (void*)&dtcl);
errCheck("Kernel Arg dtcl: ", err);

for(i=0;i<device_counter;++i){
    err = clEnqueueNDRangeKernel(queue[i], kernel, 2, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL);
    errCheck("EnqeuedNDRangeKernel device ", err);
}

结果输出为:

Q1 buffer:: Success
resQ1 buffer:: Success
NtoF Buffer:: Success
FtoN Buffer:: Success
Dr Buffer:: Success
Ds Buffer:: Success
Sx Buffer:: Success
Sy Buffer:: Success
rx Buffer:: Success
ry Buffer:: Success
Nx Buffer:: Success
Ny Buffer:: Success
mapR buffer:: Success
Fscale Buffer:: Success
fQ1 Buffer:: Success
ffQ1 Buffer:: Success
F1 Buffer:: Success
G1 Buffer:: Success
dQ1 Buffer:: Success
dQ1dr Buffer:: Success
dQ1dr Buffer:: Success
rk4b Buffer:: Success
Kernel Arg Q1: : Success
Kernel Arg NtoFcl: : Success
Kernel Arg FtoNcl: : Success
Kernel Arg Drcl: : Success
Kernel Arg Dscl: : Success
Kernel Arg mapR: : Success
Kernel Arg fQ1: : Success
Kernel Arg ffQ1: : Success
Kernel Arg F1: : Success
Kernel Arg G1: : Success
Kernel Arg dQ1: : Success
Kernel Arg dQ1dr: : Success
Kernel Arg dQ1dr: : Success
Kernel Arg sxcl: : Success
Kernel Arg sycl: : Success
Kernel Arg rxcl: : Success
Kernel Arg rycl: : Success
Kernel Arg nxcl: : Success
Kernel Arg nycl: : Success
Kernel Arg flux: : Success
Kernel Arg resQ1: : Success
Kernel Arg Fscalecl: : Success
Kernel Arg rk4bcl: : Success
Kernel Arg dtcl: : Success
EnqeuedNDRangeKernel: : Invalid kernel arguments

我很遗憾为什么EnqueueNDRange生气了。结果通常包括dt的无效arg大小

Kernel Arg dtcl: : Invalid argument size 

但是在将它移动到参数的底部之后调用错误就消失了。真是奇怪的行为。

此外,我尝试只使用一个内核参数运行程序,它仍然给我错误,然后我运行它没有内核参数和EnqueueNDRangeKernel返回CL_SUCCESS。

编辑:这是内核的标题

__kernel void clAxBtrans(__global double* Q1,
                     __global double* NtoF,
                     __global double* FtoN,
                     __global double* Dr,
                     __global double* Ds,
                     __global int* mapR,
                    __global double* fQ1,
                    __global double* ffQ1,
                    __global double* F1,
                    __global double* G1,
                    __global double* dQ1,
                    __global double* dQ1dr,
                    __global double* dQ1ds,
                    __global double* dQ1dx,
                    __global double* dQ1dy,
                    __global double* sx,
                    __global double* sy,
                    __global double* rx,
                    __global double* ry,
                    __global double* nx,
                    __global double* ny,
                    __global double* fluxQ1,
                    __global double* resQ1,
                    __global double* Fscale,
                    __global double* rk4b
this stupid thing-->  __global double* newQ1, double dt)
{

1 个答案:

答案 0 :(得分:2)

请发布内核函数,或者至少发布函数头。 你说你有25个参数,但我算26(0-25)。在输出中,只有24个成功。 问题是这两个:

err = clSetKernelArg(kernel, 13, sizeof(cl_mem), (void*)&dQ1dx);
err = clSetKernelArg(kernel, 14, sizeof(cl_mem), (void*)&dQ1dy);

的输出也是错误的
err = clSetKernelArg(kernel, 12, sizeof(cl_mem), (void*)&dQ1ds);
errCheck("Kernel Arg dQ1dr: ", err);

应为errCheck("Kernel Arg dQ1ds: ", err);

很可能你的问题是参数顺序的混淆,从而以非直观的方式导致无效的内核参数大小(因为一些将具有正确的大小,一些将不具有)。如果你发布了内核函数头文件,我们应该可以对它进行排序。