首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyOpenCL多维阵列

PyOpenCL多维阵列
EN

Stack Overflow用户
提问于 2017-07-25 13:00:22
回答 1查看 1.4K关注 0票数 2

我有这段代码,用于使用PyOpenCL进行多维数组添加。我的问题是,结果是错误的,除了第一个维度。我一直在咨询这个链接

代码语言:javascript
复制
from __future__ import absolute_import, print_function
import numpy as np
import pyopencl as cl

N = 4
a_np = np.random.rand(N,N).astype(np.float32)
b_np = np.random.rand(N,N).astype(np.float32)

ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)

mf = cl.mem_flags
a_g = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=a_np)
b_g = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=b_np)

prg = cl.Program(ctx, """
    __kernel void sum(
        __global const float *a_g, __global const float *b_g, __global float *res_g) {
            int i = get_global_id(1);
            int j = get_global_id(0);
            res_g[i,j] = a_g[i,j] + b_g[i,j];
    }
""").build()

res_g = cl.Buffer(ctx, mf.WRITE_ONLY, a_np.nbytes)
prg.sum(queue, a_np.shape, None, a_g, b_g, res_g)

res_np = np.empty_like(a_np)
cl.enqueue_copy(queue, res_np, res_g)

# Check on CPU with Numpy:
print(res_np - (a_np + b_np))
print(np.linalg.norm(res_np - (a_np + b_np)))
print (res_np)
print (a_np + b_np)

矩阵1:

代码语言:javascript
复制
[[ 0.2990678   0.76585543  0.71866363  0.30202991]
 [ 0.20604192  0.01989171  0.02402978  0.82826865]
 [ 0.75456071  0.62410605  0.4374246   0.85372066]
 [ 0.37000021  0.5734672   0.4250721   0.2456535 ]]

矩阵2:

代码语言:javascript
复制
[[ 0.83109927  0.53289926  0.24182947  0.39531609]
 [ 0.53014964  0.62028325  0.2397541   0.03364789]
 [ 0.83543158  0.1162187   0.21168791  0.22438531]
 [ 0.2178313   0.76118374  0.23737679  0.41660839]]

预期结果:

代码语言:javascript
复制
[[ 1.13016701  1.29875469  0.96049309  0.69734597]
 [ 0.73619157  0.64017498  0.26378387  0.86191654]
 [ 1.58999228  0.74032474  0.64911252  1.07810593]
 [ 0.5878315   1.33465099  0.66244888  0.6622619 ]]

脚本结果:

代码语言:javascript
复制
[[ 1.13016701  1.29875469  0.96049309  0.69734597]
 [ 0.          0.          0.          0.        ]
 [ 0.          0.          0.          0.        ]
 [ 0.          0.          0.          0.        ]]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-26 08:26:45

问题在于:

res_g[i,j] = a_g[i,j] + b_g[i,j];

这不是您在OpenCL中访问多维数组元素的方式。OpenCLC的一个子集,由维基百科提供:

在C和C++编程语言中,逗号运算符(由令牌表示)是一个二进制运算符,它计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回此值(和类型)。

因此有效地评估到:res_g[j] = a_g[j] + b_g[j];

因此,正确地说,应该是这样的:

res[i + size * j] = ...

再次查询您提供的链接,所有内容都在那里。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45304157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档