pyopencl的输出值错误

问题描述 投票:0回答:1

我正在写一段代码,其中我使用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])

如果我把 nxnz 作为小的值(例如:两个都是5),我以其他方式得到正确的结果,答案似乎并不正确。

例如,我正在寻找一个答案,如

1.0
2.0
3.0
4.0
5.0

但我从我的代码中得到

2.0
4.0
5.0
6.0
8.0

谁能告诉我,我的做法有什么不妥吗?

python opencl pyopencl
1个回答
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()
© www.soinside.com 2019 - 2024. All rights reserved.