首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pyopencl初始化非零float4阵列

pyopencl初始化非零float4阵列
EN

Stack Overflow用户
提问于 2022-04-01 18:12:45
回答 2查看 104关注 0票数 0

我想用float4类型填充数组。我不知道如何用0以外的东西初始化数组。我尝试过各种不同的方法,但这就是我所要做的,这解释了我想要做的事情:

代码语言:javascript
复制
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的实际例子,而且文档并不总是有用的,它甚至没有提到float3float4

如果我们查看OpenCL 文档,我们可以看到float4类型是一个以.x, .y, .z, .w作为其字段的结构。它也被声明为一种类型,所以我希望能够像其他类型一样使用它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-02 16:38:14

在搜索了pyopencl的源代码之后,我发现问题是由于在运行时生成的函数造成的。此外,文件中没有明确说明这些功能是可用的。因此,要将数组加载到type<n>中,需要调用函数cl.cltypes.make_type<n>并将类型设置为cl.cltypes.type<n>。因为这是在运行时生成的,所以它将不在名称空间中,因此ide将不会识别它们。

代码语言:javascript
复制
myFloat4 = cl.cltypes.make_float4(0,1,1,0)
myArrayFloat4 = np.array([myFloat4], dtype=cl.cltypes.float4)

因此,为了完整起见,以下是我的解决办法:

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2022-04-01 20:28:33

如果没有cl,下面是一个示例数组创建

代码语言:javascript
复制
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,)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71711214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档