- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我真的是 OpenCL 的新手。我从这个网站上获取了示例代码:http://www.drdobbs.com/open-source/easy-opencl-with-python/240162614?pgno=2我对它进行了一些定制。我的目标是向内核发送一个包含 1 个数字的 4x4 矩阵,然后从内核中恢复它。我知道这是一个微不足道的代码,但我需要这样做才能了解 OpenCL 的工作原理。输入矩阵是这个:
[[ 1. 1. 1. 1.]
[ 1. 1. 1. 1.]
[ 1. 1. 1. 1.]
[ 1. 1. 1. 1.]]
但是,我从内核得到的输出是这个,应该和输入一样:
[[ 1. 1. 1. 1.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]]
这是我的完整代码:
import pyopencl as cl
from pyopencl import array
import numpy as np
## Step #1. Obtain an OpenCL platform.
platform = cl.get_platforms()[0]
## It would be necessary to add some code to check the check the support for
## the necessary platform extensions with platform.extensions
## Step #2. Obtain a device id for at least one device (accelerator).
device = platform.get_devices()[1]
## It would be necessary to add some code to check the check the support for
## the necessary device extensions with device.extensions
## Step #3. Create a context for the selected device.
context = cl.Context([device])
## Step #4. Create the accelerator program from source code.
## Step #5. Build the program.
## Step #6. Create one or more kernels from the program functions.
program = cl.Program(context, """
__kernel void matrix_dot_vector(const unsigned int size, __global const float *matrix, __global float *result)
{
int x = get_global_id(0);
int y = get_global_id(1);
result[x + size * y] = matrix[x + size * y];
}
""").build()
matrix = np.ones((4,4), np.float32)
## Step #7. Create a command queue for the target device.
queue = cl.CommandQueue(context)
## Step #8. Allocate device memory and move input data from the host to the device memory.
mem_flags = cl.mem_flags
#matrix_buf = cl.Buffer(context, mem_flags.READ_ONLY | mem_flags.COPY_HOST_PTR, hostbuf=matrix)
matrix_buf = cl.Buffer(context, mem_flags.READ_ONLY | mem_flags.COPY_HOST_PTR, hostbuf=matrix)
destination_buf = cl.Buffer(context, mem_flags.WRITE_ONLY, matrix.nbytes)
## Step #9. Associate the arguments to the kernel with kernel object.
## Step #10. Deploy the kernel for device execution.
program.matrix_dot_vector(queue, matrix.shape, None, np.int32(matrix.size), matrix_buf, destination_buf)
## Step #11. Move the kernels output data to host memory.
matrix_dot_vector = np.ones((4,4), np.float32)
cl.enqueue_copy(queue, matrix_dot_vector, destination_buf)
## Step #12. Release context, program, kernels and memory.
## PyOpenCL performs this step for you, and therefore,
## you don't need to worry about cleanup code
print(matrix_dot_vector)
据我所知,int y = get_global_id(1);
的值始终为 0。这就是导致错误的原因,我不明白为什么它始终为 0,因为我将正确的形状传递给内核 program.matrix_dot_vector(queue, matrix.shape, None, np.int32(matrix.size), matrix_buf, destination_buf)
这是第二个参数 matrix.shape
和等于 (4,4)。
有没有人猜到哪里出了问题?
谢谢!
最佳答案
第一个内核参数传递了错误的值 - 大小不应该是总矩阵大小。将 np.int32(matrix.size)
更改为 np.int32(matrix.shape[0])
。
关于python - PyOpenCL 二维数组内核 get_global_id(1) 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46858668/
以下代码向我发出警告“警告:将'__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
我是一名优秀的程序员,十分优秀!