- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有使用 PyOpenCL 进行多维数组加法的代码。我的问题是,除了第一个维度之外,其他维度的结果都是错误的。我一直在咨询这个Link。
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:
[[ 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:
[[ 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]]
预期结果:
[[ 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 ]]
脚本结果:
[[ 1.13016701 1.29875469 0.96049309 0.69734597]
[ 0. 0. 0. 0. ]
[ 0. 0. 0. 0. ]
[ 0. 0. 0. 0. ]]
最佳答案
问题出在这里:
res_g[i,j] = a_g[i,j] + b_g[i,j];
这不是在 OpenCL
中访问多维数组元素的方式。 OpenCL
是 C
的子集,由维基百科定义:
In the C and C++ programming languages, the comma operator (represented by the token ,) is a binary operator that evaluates its first operand and discards the result, and then evaluates the second operand and returns this value (and type).
如此有效地评估为:res_g[j] = a_g[j] + b_g[j];
因此正确地应该是这样的:
res[i + 大小 * j] = ...
再次查阅您提供的链接,一切都在那里。
关于python - PyOpenCL 多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45304157/
以下代码向我发出警告“警告:将'__global int'传递给'__global int *'类型的参数时不兼容的整数到指针转换;使用&获取地址”并且不会产生所需的结果。 import pyopen
我使用以下命令来分析我的 Python 代码: python2.7 -m cProfile -o X2_non_flat_multiprocessing_dummy.prof X2_non_flat.
我刚刚开始通过 PyOpenCL 学习 OpenCL,并且一直在关注一些教程。我正在编写脚本 here 。程序执行时没有任何错误,但数组的求和不正确。这是确切的代码: # Use OpenCL To
我有使用 PyOpenCL 进行多维数组加法的代码。我的问题是,除了第一个维度之外,其他维度的结果都是错误的。我一直在咨询这个Link。 from __future__ import absolute
我正在 python 中尝试 OpenCl,但无法弄清楚这个简单的矩阵复制代码我做错了什么。 我的输入矩阵是: [[1 2 3 4], [5 6 7 8], [9 10 11 12], [13 14
我对 https://github.com/inducer/pyopencl/blob/master/examples/benchmark-all.py 中的标准代码进行了一些修改 用数字代替,变量z
我试图将代码的内核部分与 3 个“””存储在不同的文件中。我尝试将其另存为文本文件和 bin 文件,然后读入,但我没有用它找不到成功。它开始给我一个错误,说“””丢失,或者)丢失。 “但是,如果我只是
在运行程序时..错误是 Choose platform: [0] [1] Choice [0]:1 设置环境变量 PYOPENCL_CTX='1' to avoid being asked aga
问题描述 我正在尝试在 Anaconda 中将 pyopencl 与我的 GPU 结合使用。但是没有找到设备。在 Python 中,我得到以下输出: >>> import pyopencl as cl
我在 Windows 10 上运行 python 3.5.4 通过 Anaconda 和来自 conda-forge 的 pyopencl 2017.2,通过 Anaconda 安装。我的系统是i5
我最近发现了 GP-GPU(通用图形处理单元)的强大功能,并想利用它在单台机器上执行“繁重”的科学和数学计算(否则需要大型 CPU 集群)。 我知道有多种接口(interface)可以在 GPU 上运
我有 PyOpenCL 代码和 OpenCL C 内核代码。我在运行我的应用程序时捕获了段错误。如何使用某些调试器或其他开发工具来调试此类错误?我不知道到底该怎么做才能找出问题所在。我想到了 prin
我正在将模拟移动到 pyOpenCL 中,但无法使我的数据访问正常工作。我正在尝试提供一维向量数组(嗯,实际上有几个,但我包含的示例只使用了一个)。 目前,几个向量被复制得很好,但是数据根本不是我提供
我已经获得了提供的 OpenCL 内核以在 C 环境中执行,但是当我尝试使用 PyOpenCL 和提供的代码运行它时,出现以下错误: > Traceback (most recent call las
我有一段内核源代码,可以在我的 PC 上的 G970 上运行,但无法在我的 2015 年初配备 Iris 6100 1536MB 显卡的 MacBook pro 上编译。 platform = cl.
更新:我的内核中的 int4 是错误的。 我正在使用 pyopencl,但无法使结构对齐正常工作。在下面的代码中,调用内核两次,b 值正确返回(如 1),但 c 值具有一些“随机”值。 换句话说:我正
我正在尝试使用 pyOpenCL 填充二维数组。计算内核及其调用贴在下面: ctx = cl.Context([cl.get_platforms()[0].get_devices()[0]]) que
我想使用来自 OpenCL API 函数的 global_work_offset 参数 clEnqueueNDRangeKernel .我不知道如何在 pyopencl 中做到这一点应用程序接口(in
我想用另一个数组覆盖 PyOpenCL 数组的一部分。这么说吧 import numpy as np, pyopencl.array as cla a = cla.zeros(queue,(3,3),
我正在尝试安装 PyOpenCL在 Ubuntu 16.04 上,但出现以下错误: /usr/bin/ld: cannot find -lOpenCL collect2: error: ld retu
我是一名优秀的程序员,十分优秀!