问题标签 [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.
python - 使用 OpenCL 从灰度图像中过滤全白像素
我的目标是将值 = 255 的图像像素转换为 0。即删除所有纯白色像素。这是使用 opencv 和 opencl 在 python 中的代码:
我面临的问题是,一旦我使用上述程序中的循环,逻辑仅适用于第一张图像。即仅针对第一张图像去除白色像素,但在后续图像中看不到任何效果,即输出图像与输入图像相同,对值为 255 的像素没有任何影响。这应该很简单。我找不到任何解决方案。
请帮助我解决这个问题。
谢谢你。
opencl - 如何在 OpenCL 中处理超大图像?
我一直在研究一个 PyOpenCL 程序,它将接收一个 OpenCL 内核(代表一个图像过滤器)和一个图像,并应用所述过滤器来生成一个输出图像。问题是我需要让这个程序在任何大小的图像上运行。
我之前使用 Cloo (http://sourceforge.net/projects/cloo/) 框架使用 C# 和 OpenCL 编写了一个类似的程序,但我想让一些东西更便携(因为 Cloo 框架无法在 Linux 上正常运行)。
现在,在我的 C# 实现中,我只是将图像分成块并在每个块上运行内核。我通过在内核中将图像作为纯字节数组处理来做到这一点。但是,我现在遇到的问题是我试图在我的 PyOpenCL 实现中使用 image2d_t 数据类型,但我不确定如何将图像分成块并将它们传递给内核。
image2d_t 类是否为返回的图像添加了填充(我需要对其进行后处理),或者它可能支持某种可以为我处理这个问题的自动化方法?
非常感谢任何可以为我指明正确方向的资源!
编辑:我想我应该提到我想要这样做的原因是因为我在当前构建中遇到了内存分配异常(因为图像太大)。
python - PyOpenCl:如何调试分段错误?
我有带有 OpenCL C 内核代码的 PyOpenCL 代码。当我运行我的应用程序时,我发现了分段错误错误。如何使用调试器或其他开发工具调试此类错误?我不知道该怎么做才能找出问题所在。我想到了选项printf
或其他东西,但我想使用更强大的东西。
我相信内核代码中的错误,所以我想先调试内核代码。
UPD。我在 linux(Arch Linux,3.6.11),python 2 或 3,PyOpenCl 2012.1
optimization - 在 OpenCL 中更快地构建偏移邻域上的操作
如何对 2D 数组的许多重叠但偏移的块进行操作,以便在 OpenCL 中更有效地执行?
例如,我有以下 OpenCL 内核:
它产生正确的结果,但速度很慢......在 NVS4200M 上只有 ~25 GFLOPS,输入为 1k x 1k。(硬件规格为 155 GFLOPS)。我猜这与内存访问模式有关。每个工作项读取一个 16x16 数据块,该数据块与 16x16 区域中的所有邻居相同,并且另一个偏移数据块大部分时间与其直接邻居的数据重叠。所有读取均通过采样器。主机程序是 PyOpenCL(我认为这实际上并没有改变任何东西),工作组大小是 16x16。
编辑:根据以下建议的新版本内核,将工作区复制到局部变量:
结果:输出正确,运行时间慢 56%。如果只使用 local_src(而不是 local_src2),结果会快 10%。
编辑:以更强大的硬件为基准,AMD Radeon HD 7850 获得 420GFLOPS,规格为 1751GFLOPS。公平地说,规范是针对乘加的,这里没有乘法,所以预期是~875GFLOPS,但这与理论性能相比仍然相差很多。
编辑:为了方便任何想尝试这个的人的运行测试,下面 PyOpenCL 中的主机端程序:
编辑:考虑内存访问模式,原来的幼稚版本可能还不错;当调用read_imageui(src, sampler, (int2)(pos0.x + i, pos0.y + j))
工作组中的所有工作项时正在读取相同的位置(所以这只是一次读取??),并且在调用时read_imageui(src, sampler, (int2)(pos.x + i, pos.y + j))
它们正在读取顺序位置(因此可以完美地合并读取??)。
arrays - pyopencl 在数组中返回错误的 float3 值
我的 pyopencl 程序的行为很奇怪,我认为我从 opencl 内核收到了不准确的值。
给定以下示例:
我希望它返回一个充满 (1, 1, 1)s 的数组。但是,输出如下所示:
或者像这样
我不确定这是否是 OpenCL、PyOpenCL 的问题,或者我做错了什么。
任何帮助表示赞赏。谢谢你。
copy - PyOpenCL,数组过滤器:copy_if 与我自己的基于原子的实现
我有一个随机整数数组。例如[132, 2, 31, 49, 15, 6, 70, 18 ... , 99, 1001]
. 例如,我想生成所有大于 100 的数字的数组并获取该数组的大小。
有两种方法:
- PyOpenCL 的新功能
copy_if
。它基于GenericScanKernel
并且如果我们更深入地了解Prefix Sums。 - 使用Atomics的纯 OpenCL 解决方案
copy_if
总是正常工作吗?如我所见copy_if
,不使用原子。使用时可能会遇到麻烦copy_if
吗?
copy_if
与原子方式相比,性能如何?
你会选择什么,为什么?
opencl - 将结构传递给 openCL 内核
我想将一个结构传递给opencl内核,结构是
内存分配和初始化就像
我可以将这样的结构传递给opencl内核吗
python - 将向量 (float4) kernell 参数传递给 OpenCL (Python)
有没有简单的方法可以将 float4 或任何其他向量参数传递给 OpenCL 内核?对于标量参数(int,float),您可以在调用内核时直接传递它。对于数组参数,您必须先使用 cl.Buffer() 将其复制到 GPU,然后再传递指针。当然有可能以与数组相同的方式传递 float4。但我问是否有任何更简单,更清晰的方法。(尤其是使用 Python、numpy、pyOpenCL)
我尝试将大小为 4*float32 的 numpy 数组作为 float4 传递,但它不起作用。是否有可能以其他方式做到这一点?
例如: 内核:
Python:
我得到错误:
另一种可能性是将它作为标量 int 或 float 的集合传递 - 例如:
但这也不是很方便——如果你想将 4x float4 和 5x int3 传递给 kernell,你很容易迷失在许多变量名中。
我认为传递 int 和 float 的向量 (2,3,4) 在 OpenCL 中一定很常见 - 例如 3D 数据网格的大小。所以我想知道是否真的有必要使用 cl.Buffer() 作为指针来传递它。
我猜常量参数 float4 也比 *float 快(因为它可以被所有工作项共享为常量)
opencl - PyOpenCL enqueue_copy 在不同设备上运行时挂起
我无法让内核在两个不同的 OpenCL 平台上运行。平台的唯一区别是一个是 OpenCL 1.1,另一个是 1.2:
代码适用于此设备(OS X 10.8):
目标设备(Ubuntu 11.04):
我已经将我认为的挂起源追溯到以下代码:
两个设备之间没有代码更改,并且两个设备都运行 PyOpenCL 2013.1。我错过了什么吗?任何建议都非常感谢。
python - 编译好的 opencl 程序可以存储为单独的二进制文件吗?
我在单独的文件上有 2 个两个 python 脚本。第一个具有 opencl 程序,该程序对传递给它的图像执行一些图像处理并返回结果。第二个脚本从文件中读取图像并调用第一个脚本,将读取的图像作为参数传递并获得它返回的结果,用于进一步处理。
现在,我的文件夹中有 100 张图像。因此,第二个脚本调用第一个脚本 100 次,每次调用第一个脚本时,都会编译 opencl 内核,这是绝对没有必要的,因为所有图像的格式和尺寸都相同。有没有办法先编译一次opencl内核,以二进制格式存储它并在需要时调用它?当然,我可以将所有代码放在一个大文件中,编译内核一次并循环调用 100 次,但为了方便起见,我想要单独的文件。
硬件:
CPU:AMD A8 APU,AMD Phenom 2 X4
GPU:AMD Radeon HD 7640G + 7670M 双显卡,ATI Radeon HD5770