我想用float4类型填充数组。我不知道如何用0以外的东西初始化数组。我尝试过各种不同的方法,但这就是我所要做的,这解释了我想要做的事情:
import pyopencl as cl
import numpy as np
kernelSource = """
__kernel void addOneToFloat4(__global float4 *a)
{
int gid = get_global_id(0);
a[gid] += 1.0f;
}
"""
context = cl.create_some_context()
queue = cl.CommandQueue(context)
device = context.devices[0]
program = cl.Program(context, kernelSource).build()
N = 10
HOST_array = np.array([[1, 0, 0, 0]]*N, dtype=cl.cltypes.float4)
TARGET_array = cl.Buffer(context, cl.mem_flags.READ_WRITE | cl.mem_flags.COPY_HOST_PTR, hostbuf=HOST_array)
cl.enqueue_copy(queue, dest=TARGET_array, src=HOST_array)
program.addOneToFloat4(queue, (N,), None, TARGET_array)
cl.enqueue_copy(queue, dest=HOST_array, src=TARGET_array)
queue.finish()
print(HOST_array)当然,它不能工作,因为它理解spahe (N,4)的输入,但是由于float4只是一种类型,所以它需要(N,)大小。
我见过有人用np.zeros(N, dtype=float4)初始化,但我不想初始化为0。
我发现很少有关于pyopencl的实际例子,而且文档并不总是有用的,它甚至没有提到float3或float4。
如果我们查看OpenCL 文档,我们可以看到float4类型是一个以.x, .y, .z, .w作为其字段的结构。它也被声明为一种类型,所以我希望能够像其他类型一样使用它。
发布于 2022-04-02 16:38:14
在搜索了pyopencl的源代码之后,我发现问题是由于在运行时生成的函数造成的。此外,文件中没有明确说明这些功能是可用的。因此,要将数组加载到type<n>中,需要调用函数cl.cltypes.make_type<n>并将类型设置为cl.cltypes.type<n>。因为这是在运行时生成的,所以它将不在名称空间中,因此ide将不会识别它们。
myFloat4 = cl.cltypes.make_float4(0,1,1,0)
myArrayFloat4 = np.array([myFloat4], dtype=cl.cltypes.float4)因此,为了完整起见,以下是我的解决办法:
import pyopencl as cl
import numpy as np
kernelSource = """
__kernel void addOneToFloat4(__global float4 *a)
{
int gid = get_global_id(0);
a[gid] += 1.0f;
}
"""
context = cl.create_some_context()
queue = cl.CommandQueue(context)
device = context.devices[0]
program = cl.Program(context, kernelSource).build()
N = 10
HOST_array = np.array([cl.cltypes.make_float4(1, 0, 0, 0)]*N, dtype=cl.cltypes.float4)
TARGET_array = cl.Buffer(context, cl.mem_flags.READ_WRITE | cl.mem_flags.COPY_HOST_PTR, hostbuf=HOST_array)
cl.enqueue_copy(queue, dest=TARGET_array, src=HOST_array)
program.addOneToFloat4(queue, (N,), None, TARGET_array)
cl.enqueue_copy(queue, dest=HOST_array, src=TARGET_array)
queue.finish()
print(HOST_array)发布于 2022-04-01 20:28:33
如果没有cl,下面是一个示例数组创建
In [50]: myStruct = np.dtype(
...: [("position", float),
...: ("direction", float),
...: ("er", float),
...: ("weight", float)])
In [55]: arr = np.zeros(5,myStruct)
In [56]: arr
Out[56]:
array([(0., 0., 0., 0.), (0., 0., 0., 0.), (0., 0., 0., 0.),
(0., 0., 0., 0.), (0., 0., 0., 0.)],
dtype=[('position', '<f8'), ('direction', '<f8'), ('er', '<f8'), ('weight', '<f8')])
In [57]: arr['position']
Out[57]: array([0., 0., 0., 0., 0.])
In [58]: arr['position']=np.arange(5)
In [59]: arr['direction']=3
In [60]: arr['er']=np.array([[1,2,3,4,5]])
In [61]: arr['weight']=np.array([[1,2,3,4,5]]).T
Traceback (most recent call last):
Input In [61] in <cell line: 1>
arr['weight']=np.array([[1,2,3,4,5]]).T
ValueError: could not broadcast input array from shape (5,1) into shape (5,)https://stackoverflow.com/questions/71711214
复制相似问题