问题标签 [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.

0 投票
1 回答
238 浏览

c - OpenCL 编译问题

我是 Opencl 编程的新手。我在编译时编写了一个矩阵乘法程序给我错误我的包含文件是:

但我得到一个错误:

我正在通过以下语句编译程序:gcc -o gmmc gmm.c. 谁能帮我

0 投票
1 回答
108 浏览

c - 使用 OpenCL 的 c 中的 vigenere 加密算法无法按预期工作

我正在尝试使用 OpenCL 在 c 中制作 vigenere 加密算法,我没有 OpenCL 经验。我正在使用 mac os(所以我正在运行 OpenCL 1.2 或 1.1)并使用 Makefile 构建程序。该文件已编译,但输出不是我所期望的。

  1. 当前问题的示例:

    • 输入信息:testviegere
    • 输入键:键
    • 输出信息:UUUUUUUUUUUUUUU
  2. 预期:

    • 输入信息:testviegere
    • 输入键:键
    • 输出信息:diqdmlqzgokcbi

如果有人能告诉我我做错了什么,我将不胜感激。

这是我的 C 代码:

这是我的内核代码:

这是我的 Makefile:

0 投票
1 回答
433 浏览

opencl - OpenCL 2.0 设备命令队列不断填​​满并停止执行

我正在利用 OpenCL 的 enqueue_kernel() 函数将内核从 GPU 动态排入队列,以减少不必要的主机交互。这是我在内核中尝试做的一个简化示例:

这就是程序的一般流程,它完美地工作并且完全按照我的意图做,按照我打算做的确切顺序,除了一个问题。在某些情况下,当工作负载非常高时,随机的 enqueue_kernel() 之一将无法入队并停止程序。发生这种情况是因为设备队列已满,无法将其他任务放入其中。但我终其一生都无法弄清楚为什么会这样,即使经过广泛的研究。

我认为一旦队列中的任务(例如内核)完成,它将释放队列中的那个位置。所以我的队列实际上应该一次最多只能达到 1 或 2 个任务。但是这个程序实际上会填满设备命令队列的整个 262,144 字节大小,并停止运行。

如果有人有任何想法,我将非常感谢一些关于为什么会发生这种情况的潜在见解。我有点卡住了,在我解决这个问题之前无法继续。

先感谢您!

(顺便说一句,我在 Radeon RX 590 卡上运行,并且正在使用 AMD APP SDK 3.0 与 OpenCL 2.0 一起使用)

0 投票
1 回答
255 浏览

c++ - openCL 支持向量作为内核参数吗?

我一直在考虑用 openCL 内核形式重写这段代码的方法。转换不会特别困难(摆脱 glm 类型和位掩码),但我坚持的部分是如何将_triangles_uvs_indices_normals传递给内核。openCL 中的向量是否有任何内置功能?

如果没有任何向量支持,我看到的唯一选择是float3为我需要返回的 3 个变量( 、 和 )中的每一个_triangles传递_uvs4个类型数组_normals和 2 个float3for数组_indices。然后在 CPU 中将数组转换回向量并缩小它们以适应。我不太确定将这么多内存缓冲区传递给内核是一种有效的方法,因为那将是从内核传递和返回的 14 个数组。并行化时我无法使用的其他解决方案。有没有办法简化这个解决方案,或者更好但更好的解决方案?

我遇到问题的功能是_addRectangle并且_createMesh是将在内核中组合的功能。

谢谢!

编辑:存储数据的一种可能更有效的方法是几种 float4 类型。例如:

0 投票
0 回答
98 浏览

c++ - clEnqueueReadBuffer 不会将所有值分配给指向 std::vector 数据的 cl_mem 缓冲区

https://i.stack.imgur.com/TA9v6.png

我一直在尝试编译一个内核,该内核使用 OpenCL 通过 clEnqueueReadBuffer 函数将某些索引分配给 std::vector,但它似乎无法正常工作,因为第一个结果是 std::vector 中唯一分配的

c++中主机的源代码如下:

内核代码:

0 投票
0 回答
55 浏览

c++ - 带有 enqueue_event 的 OpenCL 2.x clk_event_t 给出了令人惊讶的错误

我有一个使用 enqueue_event 的简单设备端内核。一切都按预期工作,直到我定义了一个 clk_event_t,我想用它来排队几个相互等待的内核。问题:在定义 clk_event_t 时,“buffer”数组在每个坐标中自动取值 0.0。如果我删除带有 clk_event_t 定义的行,代码将按预期工作,ScalarMultHelp 完全符合我的要求。似乎缓冲区指针以某种方式被更改,因为设置缓冲区 [0] 和缓冲区 [1] 的行根本没有效果。我的代码(简化):

内核在 NVIDIA Geforce GTX Ti 1050 上运行,内核程序使用 -cl-std=CL2.0 标志构建,以便使用 NVIDIA 驱动程序启用 opencl 2.0 功能。

我已经尝试找到解决方案很长一段时间了,但我在网上找不到任何东西。

0 投票
0 回答
84 浏览

opencl - clEnqueueNDRangeKernel 可能会阻塞有什么原因吗?

我正在开发一个使用 OpenCL 的应用程序,针对 1.2 版本。我使用 DX11 互操作性来显示内核结果。我在 Intel (iGPU) 和 Nvidia 平台上尝试我的代码,在这两个平台上我都发现了相同的行为。

我对 clEnqueueNDRangeKernel 的调用阻塞了 CPU 线程。我检查了文档,但找不到声明内核调用可能阻塞的情况。我在一些论坛上读到,这些事情有时会在某些 OpenCL 实现中发生。该代码工作正常并输出有效结果。API 在任何给定点都不会返回任何错误,一切看起来都很顺利。

我无法粘贴完整的源代码,但我会粘贴循环部分:

所以我的问题是:

  • ¿ 你知道 clEnqueueNDRangeKernel 会阻塞的任何原因吗?
  • ¿ 您知道 Dx11 互操作是否会导致此问题?
  • ¿ 你知道某些 OpenCL 配置是否可以创建同步内核启动吗?

谢谢 :)

编辑1:感谢doqtor评论,我意识到注释掉内核的部分内核启动变得异步。结果不好,但我有一些提示可以找出答案。

0 投票
2 回答
180 浏览

opencl - OpenCL 在运行时从 Host 函数创建内核

我正在尝试一些 OpenCL,并想知道是否有办法将函数作为参数传递给内核,或者最接近的可用匹配项是什么(使用 OpenCL 1.2)。

例如,考虑一个简单的蒙特卡洛积分,如下所示:

我发现在 OpenCL 中将函数作为参数传递,它告诉我传递函数指针不起作用。所以我猜想在运行时生成带有 f 定义的内核源然后编译它会起作用(以前是否做过?如果是这样,我在哪里可以找到它?)。也许这种问题不使用 OpenCL 而是使用 SYCL(我几乎一无所知)更容易解决?

我对此比较陌生,所以如果这种问题以完全不同的方式解决,请告诉我。

0 投票
1 回答
118 浏览

c++ - 为什么这个 printf 函数修复了我的 OpenCL 内核?

我正在编写一个使用 Hillis-Steele 扫描模式计算累积直方图的内核。它似乎无法正常工作 - 输出数字太高且顺序错误。

不过在调试过程中,我添加了一个简单的 printf() 函数,它只打印出每个正在运行的工作项的全局大小:

有人能告诉我这里发生了什么吗?是否有任何东西可以修复此代码,而不是一遍又一遍地打印 1024 到控制台?

将 OpenCL 2 与 RTX 2060 一起使用 - 如果需要任何其他信息,请告诉我,我会找到的!

0 投票
1 回答
81 浏览

c - 在 OpenCL 中计算单个位?

我必须使用 OpenCL 实现一个算法,我已经给出了一些数字来计算每个数字从某个偏移量连续形成的后续零的数量。这是代码:

其中 count 是后面的零的数量。但它不起作用,它给了我一个接近 56 的数字,偏移量为 8,这意味着这些数字被视为全零或几乎全零。你看到问题出在哪里了吗?不使用 opencl 在 CPU 上执行代码似乎可以正常工作。