2024-09-21 11:37:05 发布
网友
我有一个包含数组的NumPy数组:
import numpy as np import pyopencl as cl someArray = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
现在,我想把这个数组转换成一个由vec4组成的OpenCL数组,以便对它做些什么。例如:
如何将someArray转换为SomeArrayOpenCLType?在
someArray中的数据存储在主机的内存中,这些数据必须复制到设备的缓冲存储器(someArrayAsOpenCLType)。在
someArray
someArrayAsOpenCLType
内核在设备上执行,并将结果存储在设备缓冲区(预先分配:resultAsOpenCLType)。在
resultAsOpenCLType
在执行之后,程序可以从设备的缓冲区将结果返回到主机内存(例如:cl.enqueue_copy(queue, result, 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):
0
英特尔网站上关于OpenCL的一些教程:
Intel - OpenCL™ Tutorials
someArray
中的数据存储在主机的内存中,这些数据必须复制到设备的缓冲存储器(someArrayAsOpenCLType
)。在内核在设备上执行,并将结果存储在设备缓冲区(预先分配:
resultAsOpenCLType
)。在在执行之后,程序可以从设备的缓冲区将结果返回到主机内存(例如:
cl.enqueue_copy(queue, result, resultAsOpenCLType)
)。在举一个简单的例子(但也许还有其他方法可以做到):
执行后(使用选项
^{pr2}$0
):英特尔网站上关于OpenCL的一些教程:
Intel - OpenCL™ Tutorials
相关问题 更多 >
编程相关推荐