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