我正在写一段代码,其中我使用pyOpenCL,在这段代码的一部分,我需要导入一个数组到openCL函数中(如 p )多次,并且这个数组的特殊指数必须增加另一个参数(如 原产地 的例子中,其元素总是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
谁能告诉我,我的做法有什么不妥吗?
我改变了内核,如下图所示,它工作得很好。顺便说一下,我仍然渴望如果有一个方法来避免使用的是 如果 内核中。所以,如果你有什么小窍门,请告诉我。谢谢大家!
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 i=get_global_id(0);
int j=get_global_id(1);
if (i==src_i && j==src_j){
p[i*nx+j]+=src;
}
}
""").build()