gpt4 book ai didi

python - 将向量 (float4) kernell 参数传递给 OpenCL (Python)

转载 作者:行者123 更新时间:2023-11-30 21:50:31 25 4
gpt4 key购买 nike

是否有任何简单的方法可以将 float4 或任何其他向量参数传递给 OpenCL 内核?对于标量参数(int、float),您可以在调用 kernel 时直接传递它。对于数组参数,您必须首先使用 cl.Buffer() 将其复制到 GPU,然后传递指针。当然,可能可以像数组一样传递 float4 。但我想问有没有更简单、更明确的方法。 (尤其是使用 Python、numpy、pyOpenCL)

我尝试将大小为 4*float32 的 numpy 数组作为 float4 传递,但它不起作用。是否可以通过其他方式做到这一点?

例如:内核:

__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

另一种可能是将其作为标量 int 或 float 集传递 - 例如:

__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 传递给内核,您可能很容易迷失在许多变量名称中。

我认为传递 int 和 float 的向量 (2,3,4) 在 OpenCL 中一定很常见 - 例如 3D 数据网格的大小。所以我想知道是否真的有必要使用 cl.Buffer() 作为指针来传递它。

我猜常量参数 float4 也比 *float 更快(因为它可以作为常量被所有工作项共享)

最佳答案

我发现这是在 python 中创建 float4 的好方法:

import numpy as np
import pyopencl as cl
import pyopencl.array as cl_array

data= np.zeros(N, dtype=cl_array.vec.float4)

编辑:同时提供 MWE:

import numpy as np
import pyopencl as cl
import pyopencl.array as cl_array


deviceID = 0
platformID = 0
workGroup=(1,1)

N = 10
testData = np.zeros(N, dtype=cl_array.vec.float4)

dev = cl.get_platforms()[platformID].get_devices()[deviceID]

ctx = cl.Context([dev])
queue = cl.CommandQueue(ctx)
mf = cl.mem_flags
Data_In = cl.Buffer(ctx, mf.READ_WRITE, testData.nbytes)


prg = cl.Program(ctx, """

__kernel void Pack_Cmplx( __global float4* Data_In, int N)
{
int gid = get_global_id(0);

Data_In[gid] = 1;
}
""").build()

prg.Pack_Cmplx(queue, (N,1), workGroup, Data_In, np.int32(N))
cl.enqueue_copy(queue, testData, Data_In)


print testData

关于python - 将向量 (float4) kernell 参数传递给 OpenCL (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14684020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com