数组的NumPy数组到向量的PyOpenCL数组

2024-09-21 11:37:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含数组的NumPy数组:

import numpy as np
import pyopencl as cl
someArray = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])

现在,我想把这个数组转换成一个由vec4组成的OpenCL数组,以便对它做些什么。例如:

^{pr2}$

如何将someArray转换为SomeArrayOpenCLType?在


Tags: importpyopenclnumpyclasnp数组array
1条回答
网友
1楼 · 发布于 2024-09-21 11:37:05

someArray中的数据存储在主机的内存中,这些数据必须复制到设备的缓冲存储器(someArrayAsOpenCLType)。在

内核在设备上执行,并将结果存储在设备缓冲区(预先分配:resultAsOpenCLType)。在

在执行之后,程序可以从设备的缓冲区将结果返回到主机内存(例如:cl.enqueue_copy(queue, result, resultAsOpenCLType))。在

举一个简单的例子(但也许还有其他方法可以做到):

import numpy as np
import pyopencl as cl

# Context
ctx = cl.create_some_context()
# Create queue
queue = cl.CommandQueue(ctx)

someArray = np.array([
    [1, 2, 3, 4],
    [5, 6, 7, 8]
]).astype(np.float32)

print ""
print("Input:")
print(someArray)
print("                  ")

# Get mem flags
mf = cl.mem_flags

# Create a read-only buffer on device and copy 'someArray' from host to device
someArrayAsOpenCLType = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=someArray)

# Create a write-only buffer to get the result from device
resultAsOpenCLType = cl.Buffer(ctx, mf.WRITE_ONLY, someArray.nbytes)

# Creates a kernel in context
program = cl.Program(ctx, """
__kernel void multiplyByTwo(__global const float4 *someArrayAsOpenCLType, __global float4 *resultAsOpenCLType) {
        int gid = get_global_id(0);

        float4 vector = someArrayAsOpenCLType[gid];
        resultAsOpenCLType[gid] =  vector * (float) 2.0;
}
""").build()

# Execute
program.multiplyByTwo(queue, someArray.shape, None, someArrayAsOpenCLType, resultAsOpenCLType)

# Creates a buffer for the result (host memory)
result = np.empty_like(someArray)

# Copy the results from device to host
cl.enqueue_copy(queue, result, resultAsOpenCLType)

print("                  ")
print("Output")
# Show the result
print (result)

执行后(使用选项0):

^{pr2}$

英特尔网站上关于OpenCL的一些教程:

Intel - OpenCL™ Tutorials

相关问题 更多 >

    热门问题