在内核中使用 OpenCl 全局 ID 作为整数
Use OpenCl Global ID as an integer in the kernel
我刚开始使用 pyopencl 模块研究 python 中的 OpenCl。
我有兴趣在没有任何输入的情况下生成东西,例如生成正弦波样本。
为此,我只需要全局 ID 来进行计算,但返回全局 ID 会产生一些花哨的数字。我使用下面的代码:
import numpy as np
import pyopencl as cl
Size = Width*Height
# Get platforms, both CPU and GPU
plat = cl.get_platforms()
GPU = plat[0].get_devices()
#Create context for GPU
ctx = cl.Context(GPU)
# Create queue for each kernel execution
queue = cl.CommandQueue(ctx)
mf = cl.mem_flags
# Kernel function
src = '''
__kernel void shader(__global float *result, __global int *width){
int w = *width;
size_t gid = get_global_id(0);
result[gid] = gid;
}
'''
#Kernel function instantiation
prg = cl.Program(ctx, src).build()
#Allocate memory for variables on the device
width_g = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=np.int32(Width))
result_g = cl.Buffer(ctx, mf.WRITE_ONLY, Size*8)
# Call Kernel. Automatically takes care of block/grid distribution
prg.shader(queue, (Size,), None , result_g, width_g)
result = np.empty((Size,))
cl.enqueue_copy(queue, result, result_g)
Image = result
我所做的只是将全局 ID 复制到缓冲区对象 result_d,但是当我检查 result 时,我得到一些甚至不是整数的数字。我也尝试将缓冲区设置为整数而不是浮点数,但结果还是一样。
我做错了什么?
问题是OpenCL内核中的result
是float
类型,host端的result
是double
类型.
将主机缓冲区指定为 float
以解决问题:
result = np.empty((Size,),dtype=np.float32)
我刚开始使用 pyopencl 模块研究 python 中的 OpenCl。
我有兴趣在没有任何输入的情况下生成东西,例如生成正弦波样本。
为此,我只需要全局 ID 来进行计算,但返回全局 ID 会产生一些花哨的数字。我使用下面的代码:
import numpy as np
import pyopencl as cl
Size = Width*Height
# Get platforms, both CPU and GPU
plat = cl.get_platforms()
GPU = plat[0].get_devices()
#Create context for GPU
ctx = cl.Context(GPU)
# Create queue for each kernel execution
queue = cl.CommandQueue(ctx)
mf = cl.mem_flags
# Kernel function
src = '''
__kernel void shader(__global float *result, __global int *width){
int w = *width;
size_t gid = get_global_id(0);
result[gid] = gid;
}
'''
#Kernel function instantiation
prg = cl.Program(ctx, src).build()
#Allocate memory for variables on the device
width_g = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=np.int32(Width))
result_g = cl.Buffer(ctx, mf.WRITE_ONLY, Size*8)
# Call Kernel. Automatically takes care of block/grid distribution
prg.shader(queue, (Size,), None , result_g, width_g)
result = np.empty((Size,))
cl.enqueue_copy(queue, result, result_g)
Image = result
我所做的只是将全局 ID 复制到缓冲区对象 result_d,但是当我检查 result 时,我得到一些甚至不是整数的数字。我也尝试将缓冲区设置为整数而不是浮点数,但结果还是一样。
我做错了什么?
问题是OpenCL内核中的result
是float
类型,host端的result
是double
类型.
将主机缓冲区指定为 float
以解决问题:
result = np.empty((Size,),dtype=np.float32)