有沒有簡單的方法讓float4或任何其他向量參數傳遞給OpenCL內核? 對於標量參數(int,float),可以在調用內核時直接傳遞它。對於數組參數,您必須先使用cl.Buffer()將其複製到GPU並傳遞指針。當然,可能可以像傳遞數組一樣傳遞float4。但我問是否有更簡單更清晰的方法。 (特別是使用Python,numpy,pyOpenCL)向OpenCL傳遞vector(float4)kernell參數(Python)
我嘗試通過numpy數組大小爲4 * float32作爲float4,但它不起作用。其他方式可以做到嗎?
例如: kernnel:
__kernel void myKernel(__global float * myArray, float myFloat, float4 myFloat4)
的Python:
myFloat4 = numpy.array ([1.0 ,2.0 ,3.0], dtype=np.float32)
myArray = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=myArray_host)
kernelargs = (myArray , numpy.float32(myFloat) , myFloat4)
prg.myKernel(queue, cl_myArray.shape() , None, *(kernelargs))
我得到錯誤:
pyopencl.LogicError: when processing argument #2 (1-based): clSetKernelArg failed: invalid arg size
其他possibiliy是把它當作標量整數或浮點數的集合 - 像:
__kernel void myKernel(__global float * myArray, float myFloat, float myFloat4_x, float myFloat4_y, float myFloat4_z )
kernelargs = (myArray , numpy.float32(myFloat) ,numpy.float32(myFloat4_x),numpy.float32(myFloat4_y),numpy.float32(myFloat4_z))
而這也是不是很方便 - 您可以在許多變量名很容易丟失,如果你想例如通過4X個float4和5x int3給kernell。
我認爲在OpenCL中傳遞int和float的向量(2,3,4)必須非常普遍 - 例如3D數據網格的大小。所以我想知道是否真的有必要使用cl.Buffer()作爲指針來傳遞它。
我想這常變量個float4也快於*浮子
您定義myFloat4作爲numpy的陣列。如果這被視爲一個實際的數組,那麼你不能像float4那樣將它作爲參數傳遞,因爲它實際上是float vec [4]。在C/C++中,你可以將它轉換爲float4,但我不知道它在Python中是如何工作的。 –