【发布时间】:2020-05-14 03:28:23
【问题描述】:
我正在编写一个使用 pyOpenCL 的代码,并且在该代码的一部分中,我需要多次将一个数组导入到 openCL 函数(如示例中的 p)和一个该数组的特殊索引必须增加另一个参数(如示例中的 src ,其元素始终为 1 作为示例)。我写了以下代码,但它不能正常工作。
import pyopencl as cl
import numpy as np
import os
os.environ['PYOPENCL_CTX']='0:1'
ctx=cl.create_some_context()
queue=cl.CommandQueue(ctx)
mf=cl.mem_flags
prg=cl.Program(ctx,"""
__kernel void src_injection(__global float *p,int src_i,int src_j, float src)
{
int nx=get_global_size(1);
int idx=src_i*nx+src_j;
p[idx]+=src;
}
""").build()
nz, nx=50,50
nt=5
p =np.zeros((nz,nx),dtype=np.float32)
p_buff = cl.Buffer(ctx, mf.READ_WRITE | mf.COPY_HOST_PTR, hostbuf=p)
src=np.ones(nt,dtype=np.float32)
i=np.int32(2);
j=np.int32(2);
for k in range(nt):
prg.src_injection(queue,(nz,nx),None,
p_buff,i,j,src[k])
cl.enqueue_copy(queue,p,p_buff)
print(p[i,j])
如果我将 nx 和 nz 设置为较小的值(例如,两者都为 5),我会以其他方式得到正确的结果,答案似乎不正确.
例如,我正在寻找类似的答案
1.0
2.0
3.0
4.0
5.0
从我的代码,但我得到
2.0
4.0
5.0
6.0
8.0
谁能告诉我,我做错了什么? 谢谢
【问题讨论】: