2013-06-22 38 views
3

我想将一个cl_mem缓冲区数组传递到一个内核中,但这似乎是不可行的。任何人都知道这里有什么意义?如果实际上不可行,那么当我想将许多缓冲区对象传入内核时,我该如何实现该目标?非常感谢。如何将一个cl_mem缓冲区数组传递给OpenCL设备

+0

除了clEnqueueNDRangeKernel()? –

+0

clEnqueueNDRangeKernel是什么意思?它只是启动内核,而不是将参数传递给内核。我使用clSetKernelArg将参数传递给内核,不是吗? – acekiller

回答

0

对于内核如

kernelString = "__kernel void advect(" + 
       "  __global float *x,"+ 
       "  __global float *y,"+ 
       "  __global float *z,"+ 
       "  __global float *vx,"+ 
       "  __global float *vy,"+ 
       "  __global float *vz,"+ 
       "  ... many arguments,"+ 
       "  __global float *x2,"+ 
       "  __global float *y2,"+ 
       "  __global float *z2,"+ 
       "  __global float *vx2,"+ 
       "  __global float *vy2,"+ 
       "  __global float *vz2)"+ 
       "{"+ 
       "..."+ 
       "}"+ 

不是

CL.clSetKernelArg(kernel0, 0, Sizeof.cl_mem, Pointer.to(girisDizisi0Buf)); 
    CL.clSetKernelArg(kernel0, 1, Sizeof.cl_mem, Pointer.to(girisDizisi1Buf)); 
    CL.clSetKernelArg(kernel0, 2, Sizeof.cl_mem, Pointer.to(girisDizisi2Buf)); 
    CL.clSetKernelArg(kernel0, 3, Sizeof.cl_mem, Pointer.to(girisDizisi3Buf)); 
    CL.clSetKernelArg(kernel0, 4, Sizeof.cl_mem, Pointer.to(girisDizisi4Buf)); 
    CL.clSetKernelArg(kernel0, 5, Sizeof.cl_mem, Pointer.to(girisDizisi5Buf)); 

您可以在一个循环

for(int i=0;i<max;i++) 
{ 
     CL.clSetKernelArg(kernel0, i, Sizeof.cl_mem, Pointer.to(BufferYourArray[i])); 
} 

做同样的你的数组,如果你是在Java的包装这样做,您可能需要一个String concatenator方法来将实际参数放入内核字符串中。你也可以使用二维参数。它不应该是C/C++封装中的字符串问题。

相关问题