Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在内核中将OpenCl全局ID用作整数_Python_Opencl_Pyopencl - Fatal编程技术网

Python 在内核中将OpenCl全局ID用作整数

Python 在内核中将OpenCl全局ID用作整数,python,opencl,pyopencl,Python,Opencl,Pyopencl,我刚开始使用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].g

我刚开始使用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,但当我检查结果时,我得到一些不是偶数的数字。我还尝试将缓冲区设置为整数而不是浮点,但结果仍然相同

我做错了什么?

问题是OpenCL内核中的结果是float类型,而主机端的结果是double类型

指定要浮动的主机缓冲区以解决此问题:

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