2017-04-21 60 views
0

我刚刚开始使用pyopencl模块查看python中的OpenCl。在内核中使用OpenCl全局ID作为整数

我有兴趣生成没有任何输入的东西,例如生成正弦波的样本。

要做到这一点,我需要的只是全局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,但是当我检查结果,我得到一些数字,甚至不是整数。我也尝试将缓冲区设置为整数而不是浮点数,但结果仍然相同。

我在做什么错?

回答

2

的问题是,在OpenCL的内核resultfloat类型的并在主机侧的resultdouble类型。

指定主机缓冲器是float来解决这个问题:

result = np.empty((Size,),dtype=np.float32)