问题标签 [pyopencl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4301 浏览

python - PyOpenCL 矩阵乘法

我有这个代码用于使用 pyopenCL 进行矩阵乘法。我的问题是某些矩阵的结果是错误的,我不明白为什么。经过一些研究,我认为它与类似的全球规模有关,但我不明白如何设置这些值。

例如:

使用 numpy dtype = float32 的矩阵

矩阵 1:

矩阵2:

预期结果:

脚本结果:

脚本:

谢谢!

0 投票
0 回答
152 浏览

opencl - 如何在 pyOpenCL 中分散列表?

让我们的列表大小为 500,我们有 4 个内核,我们希望将列表的 1/4 分配给每个内核。我们如何在 OpenCL 或 pyOpenCl 中做到这一点?

我知道某处可能应该存在障碍,但是我们如何将数据发送到其他内核?OpenCL 中是否有 Scatter 的示例?

0 投票
1 回答
375 浏览

python - PyOpenCL 在 OS X 上无法正常工作,没有输出

我正在尝试让 PyOpenCL 在我的 iMac 上运行,该 iMac 运行带有 NumPy 1.5.1 和 Python 2.6.0 的 Mac OS X Lion。我首先使用easy_install安装了PyOpenCL,然后我尝试了这里的解释:http ://wiki.tiker.net/PyOpenCL/Installation/Mac

当我运行演示脚本(http://documen.tician.de/pyopencl/#)时,它显示了 OpenCL 设备(英特尔酷睿 i3 和 ATI Radeon HD5670),但是当我选择两者之一时,都打印 0.0

这里出了什么问题?提前致谢!

0 投票
1 回答
500 浏览

opencl - OpenCL:如何传递大小大于 max_parameter_size 的参数?

出于对调用 OpenCL 内核时可以传递的最大参数大小的好奇,我发现我可以传递一个大小大于最大大小的数组。这是正在发生的事情:(顺便说一句,我正在使用 pyopencl )

在谷歌搜索中,我了解到 1024 以字节为单位。(我忘了它是在哪里声明的,我认为是一个 Nvidia 论坛。)

现在,我运行了这个脚本:

在调用内核之前,我做了以下事情:

然后我调用内核并检查 B 中的非零元素:

所以,很明显,我可以发送和读回大小大于cl.max_parameter_size. 这怎么可能?或者我哪里错了?

0 投票
1 回答
838 浏览

opencl - (Py)OpenCL:将浮点数添加到图像中随机位置的最快方法?

更新了不同的问题描述。我之前的问题建议的双向路径跟踪不是一种选择。

我有一个使用 OpenCL 进行一些计算(物理模拟)的 Monte Carlo 代码。主机代码是用 Python 和 PyOpenCL 编写的。OpenCL 内核的最终结果是图像(检测器数据)的坐标元组(x,y 位置 + 强度/灰度值)。我有 3 个向量/一维数组(x 位置、y 位置和灰度值各一个)。每个一维数组大约有 1e6 到 1e8 个整数,其中 x,y 是整数,灰度值浮动。要创建的图像是几个 1000x1000 像素(1e6 到 1e7 像素)。
最终,我需要在每次运行时创建多个图像(每个图像具有不同的坐标元组),因此效率和低内存使用变得很重要。

从这些数据生成二维数组或图像的最快方法是什么?对同一位置 (x,y) 的多次写入确实发生了,我找不到一个好的解决方案来并行或在模拟期间执行此操作(因为可能同时写入图像中的同一位置)。

我目前所做的是将 3 个向量/一维数组复制回主机,并使用内联 C 函数在主机上串行生成图像。

代码中最耗时的部分是为 3 个一维数组创建输出缓冲区数组,然后在内核完成后从设备复制到主机。如果我可以:
i)将数据保存在设备上并使用第二个内核(经过测试,但如果串行完成会非常慢)
生成图像,或者我可以在内核中生成图像正在运行,因此总体上摆脱了 1D 数组。

ii) 是首选,但我不知道该怎么做。write_image 是否识别多个工作项是否要写入同一个数组索引?
我已经测试并行化 i) 通过为两个工作组生成 2 个独立的 2D 图像数组,每个工作组有 1 个工作项,每个项迭代超过 1D 向量的一半(工作),但是对于更多工作项和独立图像,创建额外的开销2D 数组耗时太长并且消耗太多内存。

任何想法表示赞赏。

0 投票
1 回答
342 浏览

python - 为什么这个 opencl 代码是不确定的?

以下 python 代码使用 PyOpenCL 用数组 b 中的元素之和填充数组a_plus_b(这不是我的实际目标,但它是我能找到的最简单的代码,但仍然显示了问题)。

给出输出:

但是,如果我将宽度从 32 更改为 33,则数组不再是同一个元素。

事实上,每次运行代码时,都会产生不同的结果。

造成差异的原因是什么?什么不是

0 投票
1 回答
1926 浏览

python - OpenCL 和 Python 中的 Bigint

我正在尝试在 Python 中实现 RSA,但我想在 GPU 上运行密集计算。我已经成功地实现了我自己在 PyOpenCL 中运行的模幂运算,但是对于基数和指数,我都使用了六位整数。比这更大的数字和 GPU 崩溃。

我需要在 numpy 中创建一个非常大的整数值数组并将它们发送到 PyOpenCL 代码,并在 GPU 上对大整数进行乘法和模运算。

有没有人做过类似的事情?谷歌搜索 cuda 和 bigint 并没有给出任何好的结果。:(

0 投票
1 回答
339 浏览

python - 尝试读取 image2d 时非常小的 OpenCL 内核上令人费解的错误(使用 pyopencl)

在开发一个应该计算图像上某些特征的 OpenCL 内核时,我遇到了一个我无法解决的错误。为了解决这个问题,我构建了一个愚蠢的、微小的内核,它仍然返回错误的值。这里是:

如您所见,该内核仅适用于一个工作组,其中每个线程将图像的红色通道复制到全局缓冲区中。
我在 6 x 6 像素的图像上使用 1 个大小为 (2, 2) 的工作组调用此内核。此外,只有红色通道包含不同于 0 的值。这些值从 0 到 35,左上角像素的红色值设置为 0,其右邻像素为 1,依此类推,直到右下角像素的红色值值设置为 35。以下是一些 Python 代码片段:

检测器是处理 OCL 调用的类的一个实例,这里是 *read_img* 函数:

最后是如何实例化变量 *cl_image_format* :

因此,如果一切正常,结果应该是 [0. 1. 6. 7.] 而不是我得到 [0. 24. 4. 28.]。
我在三个不同的设备上测试了这段代码:2 个 ATI 和 1 个 NVIDIA。全部返回相同的错误结果。我还制作了一个小型 C 程序,它执行与 python 相同的操作并调用相同的内核,这一次返回了正确的结果。所以我的错误出在python代码中,但我真的看不到它,尽管它一定就在我的眼皮底下。有人知道可能出了什么问题吗?
谢谢
PS 我使用的是 Win7 x64,免费的 EPD 7.3-2 分发版,python 2.7.3,我使用了这个网站上的 pyopencl 安装程序。

0 投票
2 回答
6194 浏览

performance - OpenCL matrix multiplication should be faster?

I'm trying to learn how to make GPU optimalized OpenCL kernells, I took example of matrix multiplication using square tiles in local memory. However I got at best case just ~10-times speedup ( ~50 Gflops ) in comparison to numpy.dot() ( 5 Gflops , it is using BLAS).

I found studies where they got speedup >200x ( >1000 Gflops ). ftp://ftp.u-aizu.ac.jp/u-aizu/doc/Tech-Report/2012/2012-002.pdf I don't know what I'm doing wrong, or if it is just because of my GPU ( nvidia GTX 275 ). Or if it is because of some pyOpenCl overhead. But I meassured also how long does take just to copy result from GPU to RAM and it is just ~10% of the matrix multiplication time.

}

NOTE - the strange BLOCK_SIZE=22 is the maximum BLOCK_SIZE which does fit to max work_group_size which is 512 on my GPU. In this code must hold condition BLOCK_SIZE^2 < max work_group_size. 22=int(sqrt(512)). I tried also BLOCK_SIZE=16 or 8 but it was slower tan with 22.

I also tried simple matrixMul (without using local memory) but it was even 10-times slower than numpy.dot(). I copied the code here http://gpgpu-computing4.blogspot.cz/2009/10/matrix-multiplication-3-opencl.html they say that even the simple version (without local memory) should run 200x faster than CPU? I don't undrestand that.

the dependecne of performance in my case is:

NOTE - the "Gflops" number is obtained as N^3/time and it does include time required to copy results from GPU to main memory, but this time is just few percent of total time especially for N>1000

maybe more pictorial is time in secons:

I was thinking that maybe some speed improvement can be obtained using async_work_group_copy or even read_imageui to copy blocks to local memory. But I don't understand why I have so big difference when I'm using basically the same code as people who say they have 200x speedup?????

0 投票
2 回答
439 浏览

pyopencl - pyOpenCL 没有运行,没有错误

我正在尝试开始使用 pyOpenCL,但在运行示例时遇到了问题。我简化了代码,试图弄清楚我下面的内容是怎么回事。当我运行代码时,它只会打印 1。它不会产生任何错误。如果我只调用 cl.create_some_context(),也会发生同样的情况。

我正在运行带有 AMD CPU 和 ATI GPU 的 windows 7、python 2.7。我已经更新了我的驱动程序。据我所知,我的 GPU 不支持 OpenCL,但我的 CPU 支持。

CPU:AMD速龙II X2 250

显卡:ATI Radeon HD 4600

输出:

谢谢!