问题标签 [opencl-c]
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.
c# - 如何使用 OpenCL 将位图转换为纯黑白
我有一个 WPF - C# 项目,我正在尝试加快我在其中进行的图像处理;通过使用 OpenCL 和 Cloo 来完成。
我确实设法让内核工作,可以将位图更改为灰度,但由于某种原因,我制作的黑白内核只输出一个完全黑色的图像。
这是我的内核.cl
代码:
我哪里错了?
任何帮助或提示将不胜感激。
我根据@ProjectPhysX 的有用建议更新了我的内核代码:
这是将图像添加到 OpenCL 图像内存缓冲区的 C#:
c - OpenCL:在全局内存地址 0x### 的大小写无效
解决方案后编辑:问题仅在于代码。这里没有硬件问题。现在回到原来的帖子:
我正在尝试让一个基本的 OpenCL 程序正常工作。
该程序只是创建一个缓冲区,将 42 写入缓冲区,读取它,然后输出。
这是用C编写的代码:
该程序不起作用。它使缓冲区保持不变并通过 oclgrind 引发错误。
这是输出:
如果这是系统问题,这里是clinfo
.
我正在使用带有 Radeon Graphics (16) @ 1.7000Ghz 的 AMD Ryzen 7 PRO 4750U。
我正在运行 Arch Linux。
有没有人知道问题可能是什么?谢谢!
PS,任何对我的代码或我的问题措辞的批评,无论是否民事,我都欢迎!
opencl - 相当于 OpenCL 中的 cudaSetDevice?
我有一个为 1 个 gpu 编写的函数,它使用一组 args 运行 10 秒,而且我有一个很长的 args 列表要通过。我想同时使用我的 AMD gpus,所以我有一些启动 2 个线程的包装器代码,并在线程 0 上使用参数 gpu_idx 0 和在线程 1 上使用参数 gpu_idx 1 运行我的函数。
我有另一台机器的 cuda 版本,我只是跑来checkCudaErrors(cudaSetDevice((unsigned int)device_id));
获得我想要的行为。
使用 openCL,我尝试执行以下操作:
context 是我的 *c 文件中的一个静态变量,我稍后在创建内核时再次使用它。
当我仅使用 device_idx 0 或仅使用 device_idx 1 运行时,此代码有效,即使我在两个终端窗口中手动使用 device_idx 0 和 device_idx 1“同时”运行可执行文件。
但是,线程“过于”并发,这会阻止此代码工作。事实上,根据睡眠量(上面评论),我得到不同的行为(有时两个线程都在 gpu 0 上工作,有时两个线程都在 gpu 1 上工作,有时线程在两个 gpu 上都是平衡的)。如果我睡得太少,我会得到:CL_INVALID_CONTEXT
如果我根本不睡觉,我会得到CL_INVALID_KERNEL_NAME
。
就像我说的那样,仅在 gpu 0 或 gpu 1 上单独运行时,我不会遇到任何错误,只有在产生多个调用此代码的线程时(作为 *so 与来自 go 的 extern C 函数)同时在线程 0 中使用 device_idx 0和线程 1 中的 device_idx 1。
我该如何解决我的问题?我认为我有一个可以在 1 个 gpu 上运行的可执行文件,我为此指定了哪个 gpu,并且应该遵守该规范。
当两个设备都需要使用时,选择设备的正确方法是什么,一个与另一个完全分开?
c - 如何在 OpenCL 中将数据从设备内存子缓冲区传输到主机程序?
我正在从 Matthew Scarpino 的“OpenCL in action”一书中学习 OpenCL 。第 3 章包含有关缓冲区(pp.45-47)和子缓冲区(pp.47-48)组织的材料。第 47 页上的用于创建子缓冲区的代码示例存在不准确之处,此处和此处的相同问题对此进行了披露。我更进一步并决定调查将存储在子缓冲区中的值传输回主机程序的情况。
我的主机程序正在将一个整数数组传输iaArray1[5] = { 1, 2, 3, 4, 5 }
到内核中。缓冲区memObjArray1
用于执行此操作。从iaArray1
数组ipaArray2
中获得数组,将值存储{ 3, 4, 5, 6, 7 }
为内核将数组的值与常数 2 相加。memObjArray2
输出缓冲区用于将ipaArray2
数组的值完全从设备传输到主机程序。接下来,memObjSubArray
从缓冲区形成子memObjArray2
缓冲区。正在尝试将数据从设备内存子缓冲区传输memObjSubArray
到主机程序。
我相信缓冲区和子缓冲区的数据从内核传输到主机程序的机制是相同的。为此,我使用了相同的函数clEnqueueReadBuffer()
,但程序给出了错误消息。我究竟做错了什么?应该使用什么函数将数据从设备内存子缓冲区传输到主机程序?
内核函数如下:
这是我的程序的代码。所呈现的程序有几个简化。首先,简化了出口分支以缩短代码。其次,原始程序设计为使用多个 cl 文件,因此其中一些变量是数组。
opencl - 将原生 C 矩阵乘法转换为 OpenCl SIMD 矩阵乘法
我目前正在优化 OpenCL 代码以提高性能,我将以下方法确定为性能瓶颈,我想用等效的 OpenCL-SIMD-Replacement 替换它:
所以我想我可以像这样替换它:
但它没有相同的结果。我究竟做错了什么?
谢谢
performance - OpenCL 在内存和性能方面,在内核代码中使用用户定义函数的效率如何
在 OpenCL C 内核代码中,默认的内置函数很好,但用户定义的函数呢?与内置的相比,它们是否有任何性能和内存下降?如果是这样,在 __kernel void 中编写上述用户定义函数一次或多次是否更好?
例如:-
以上是一个内置函数,对性能没有影响,也不会减少gpu l0/l1缓存内存
通过用户定义的函数,我的意思如下
这些函数是否对 l0/l1 内存有任何影响,如果是,那么最好不要将这些函数编写为函数,而是在任何地方使用代码?
opencl - OpenCL 内核函数在不同设备(CPU 与 GPU)上运行时会产生不同的结果
我试图弄清楚我的 OpenCL 内核函数中发生的奇怪行为。我基本上是在尝试将包含十六进制的字符串转换为包含十进制表示的字符串,但是由于我无法理解的原因,使用 GPU 和 CPU 运行相同的内核会产生不同的结果。
内核如下所示:
现在,如果我作为testKernel
函数的参数传递 lenght4
和包含十六进制值的输入字符串3e2b
,我希望它们被转换为十进制62
并且43
(请参阅此表以了解十六进制 - >十进制转换)。
而且,如果我使用我的 CPU(Intel(R) Core(TM) i9-9880H)运行内核,我确实可以看到以下转换发生:
但是,如果我使用我的 GPU (AMD Radeon Pro 5500M) 运行同样的内核,我会看到以下结果:
似乎converted_message
在循环内部成功写入(1)
,但是当我进入内部(2)
循环时它的值会丢失。这怎么可能?是不是 OpenCL 在后台执行了一些奇怪的优化,只有在 GPU 中运行时才表现出来?
opencl - OpenCl 是库还是编译器?
我开始学习 OpenCl。我阅读了这些链接:
但我不太了解 OpenCl 是通过在源代码中包含头文件的库,还是使用 OpenCl C 编译器的编译器?!
memory-barriers - work_group_barrier 不同步缓冲区的状态,其中存在 for 循环和大量线程
A
并且B
是大小为 的缓冲区W
。
在执行之前A
用所有字节填充 1,而B
用所有零填充。我想A
在被覆盖之前读入所有线程中的局部变量,在这种情况下,只是零。这不是work_group_barrier
为了什么吗?
但是当W
超过〜5000时 - 在内核执行一些操作后我开始看到2
字节B
。什么时候W
是 10000000 - 我看到数百个2
,每次都有不同的数量。
此外,有趣的是,如果我放在B[i] = c;
障碍之前 - 只有最后一个值B
is 2
,其他一切都3
符合预期。但是放在前面A[i] = 0
没有效果。
对于这个测试,在 CPU 端,我cl_command_queue
为每个新命令创建了一个新命令,并在继续之前等待最后一个命令的事件。
我还验证了在启动内核缓冲区之前,它们处于我期望的状态。
所以 CPU 端代码不对我所看到的负责。
这是一个简化的例子,我实际上是在制作一个生命游戏。当前值的下一个状态是根据上一步中附近值的状态确定的。
所以我需要读取并保存以前的值,然后编写新的值。使用双缓冲区设置是一种选择,这就是我之前的做法,但后来我想起work_group_barrier
并决定清理代码,但发现了这个问题。
我认为问题在于线程被分成组,每个组仅在前一个组完成后执行。但是我希望2
在这些组的边缘有值,但是当'sW=1000000
的索引是:2
(每个新行都是我的程序的新执行,所以它是 3 个单独的示例)
我看不到任何关于损坏值的统一位置,所以这可能不是问题。
我有一个NVidia GeForce GTX 750 Ti
,如果这可能会有所帮助。
这可能是 NVidia 错误还是我只是误解了障碍的工作原理?
c++ - OpenCL clBuildProgram“无法打开文件:C:\Users\?”
我试图构建我的内核代码,但它不起作用。甚至没有出现错误消息和错误代码
Could not open file: C:\Users\?
,控制台上只写了短语。
通过部分注释掉,我发现了错误的位置。
以下是制造错误的部分。
我认为内核代码没有问题,因为当我故意在内核代码上出现语法错误时,我收到了另一条带有错误代码的消息
下面是我的整个代码。
这是我的完整源代码