确定 OpenCL 工作组大小的限制因素?

2024-01-02

我正在尝试在资源较少的嵌入式 GPU 上运行一些为桌面显卡编写的 OpenCL 内核。特别是,桌面版本假设始终支持至少 256 个工作组大小,但基于 Mali T628 ARM 的 GPU 仅保证 64+ 工作组大小。

事实上,一些内核报告CL_KERNEL_WORK_GROUP_SIZE只有64个,我不明白为什么。我检查了CL_KERNEL_LOCAL_MEM_SIZE对于有问题的内核,它CL_DEVICE_LOCAL_MEM_SIZE是 32 KiB,所以我想我可以排除__local贮存。

还有哪些其他因素(例如寄存器/__private内存?)导致低CL_KERNEL_WORK_GROUP_SIZE,以及如何检查使用情况?我对程序化的内省持开放态度(例如clGetKernelWorkGroupInfo()我已经做了一些),以及我可能不知道的任何开发工具。

EDIT:

这些内核是 OpenCV 的 OpenCL v2.4 模块的一部分。特别是,内核icvCalcOrientation in surf.cl https://github.com/Itseez/opencv/blob/2.4/modules/nonfree/src/opencl/surf.cl。代码相当复杂,并且设置了多个编译时参数,这就是为什么在没有一些要查看的内容的提示的情况下手动分析内核的问题有点不可行。

如果有办法在 NVidia 或 AMD 硬件(我可以访问)上解决此问题,我对此持开放态度。


EDIT

由于我之前的答案显然是错误的,因此我需要有关该问题的更多信息。

通过说“某些内核报告 CL_KERNEL_WORK_GROUP_SIZE 仅 64”,您暗示内核存在于可用的更大工作组大小的地方。是这样吗?如果不是,那么不幸的是,该设备根本无法支持超过 64 个工作项目。

您能否在内核中查询设备的所有可用信息after在执行内核之前设置所有内核参数。参数(主要取自(Source https://stackoverflow.com/questions/23017005/determine-max-global-work-group-size-based-on-device-memory-in-opencl) ) 要查询的是

  • CL_DEVICE_GLOBAL_MEM_SIZE
  • CL_DEVICE_LOCAL_MEM_SIZE
  • CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE
  • CL_DEVICE_MAX_MEM_ALLOC_SIZE
  • CL_DEVICE_MAX_WORK_GROUP_SIZE
  • CL_DEVICE_MAX_WORK_ITEM_SIZES
  • CL_KERNEL_WORK_GROUP_SIZE
  • CL_KERNEL_LOCAL_MEM_SIZE
  • CL_KERNEL_PRIVATE_MEM_SIZE 可能还有更多,但目前没有想到。

一般信息:

由于本地内存有限,因此工作组大小可能受到限制。如果您有一个使用大量私有内存的内核(“很多”是一个相对术语 - 在较弱的硬件上,即使看似很少的变量也可能达到此限制),则可以达到此限制。 “然而,这个限制只是在理想条件下。如果您的内核每个工作组使用大量 WI,则某些私有 WI 数据可能会溢出到本地内存。[...]”(Source https://stackoverflow.com/questions/23017005/determine-max-global-work-group-size-based-on-device-memory-in-opencl).

因此,一些私有内存可能会在您没有意识到的情况下交换到本地内存,因此使用的本地内存的累积大小和交换的私有内存所需的大小大于可用的本地内存大小。

CL_DEVICE_LOCAL_MEM_SIZE返回本地内存的可用大小,CL_KERNEL_LOCAL_MEM_SIZE告诉您已经使用了多少本地内存。显然,通过查看 clSetKernelArg 也考虑了动态本地内存,但是我不确定如果您查询这应该如何工作CL_KERNEL_LOCAL_MEM_SIZE before设置内核参数(这是您想要确定本地内存大小的操作......)

无论如何,OpenCL 确切地知道您使用了多少本地内存,因此它可以计算它可以支持多少个工作项(每个工作项都有可能需要交换到本地内存的私有内存)。您在查询时可能会得到这种减少的本地工作大小CL_KERNEL_WORK_GROUP_SIZE.

查看您发布的内核后,我不认为本地内存是这里的问题(这是您已经怀疑的),特别是因为您只使用了 32 KiB 本地内存中的 2 个。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

确定 OpenCL 工作组大小的限制因素? 的相关文章

  • 在混合供应商的硬件上运行 OpenCL

    我一直在他们的 Stream 2 0 beta 中使用 ATI OpenCL 实现 当前测试版中的 OpenCL 目前仅使用 CPU 下一版本应该支持 GPU 内核 我下载 Stream 是因为我的工作机器上有 ATI GPU 我编写的软件
  • 什么样的工作受益于 OpenCL

    首先 我很清楚 OpenCL 并没有神奇地让一切变得更快 我很清楚 OpenCL 有局限性 现在回答我的问题 我习惯使用编程进行不同的科学计算 我处理的一些事情在计算的复杂性和数量方面非常激烈 所以我想知道 也许我可以使用 OpenCL 来
  • OpenCL 中的最佳本地/全局工作规模

    我想知道如何在 OpenCL 中为不同设备选择最佳的本地和全局工作大小 AMD NVIDIA INTEL GPU 有什么通用规则吗 我是否应该分析设备的物理构建 多处理器数量 多处理器中的流处理器数量等 这取决于算法 实现吗 因为我看到一些
  • 不受信任的 GPGPU 代码(OpenCL 等)- 安全吗?有什么风险?

    在典型的 CPU 上运行不受信任的代码有很多方法 沙箱 假根 虚拟化 GPGPU 不受信任的代码 OpenCL cuda 或已编译的代码 怎么样 假设在运行此类第三方不受信任代码之前清除了显卡上的内存 是否存在安全隐患 什么样的风险 Any
  • 在 OpenCL 中,mem_fence() 与 Barrier() 相比有何作用?

    Unlike barrier 我想我明白 mem fence 不影响工作组中的所有项目 OpenCL 规范指出 第 6 11 10 节 对于mem fence 命令加载和存储执行内核的工作项 所以它适用于single工作项 但同时 在第 3
  • 计算 OpenCL C 中内核代码的运行时间

    我想测量内核代码在各种设备 即 CPU 和 GPU 上的性能 读取运行时 我写的内核代码是 kernel void dataParallel global int A sleep 10 A 0 2 A 1 3 A 2 5 int pnp p
  • 预处理器愚蠢的做法(对 #include 进行字符串化)

    注意 这个问题与 OpenCL 本身无关 请检查最后一段以获取我的问题的简洁陈述 但提供一些背景 我正在编写一些使用 OpenCL 的 C 代码 我喜欢将 OpenCL 内核的源代码保存在自己的文件中 以便于编码和维护 而不是直接将源代码作
  • 内存复制速度对比 CPU<->GPU

    我现在正在学习 boost compute openCL 包装库 我的复制过程非常慢 如果我们将 CPU 到 CPU 的复制速度调整为 1 那么 GPU 到 CPU GPU 到 GPU CPU 到 GPU 复制的速度有多快 我不需要精确的数
  • 工作组之间的 OpenCL 同步

    是否可以同步 OpenCL 工作组 例如 我有 100 个工作组 每个工作组只有一个项目 不要问我为什么 这是一个例子 我需要对每个工作项设置障碍 以确保所有工作组都会在这 100 个工作组中的每个工作项达到此障碍点后继续 不 你不能 您可
  • 高清处理器显卡 (HD4000) 无法作为英特尔 OpenCL SDK 中的设备加载

    我使用 i7 3770K Ivy Bridge 和 HD 4000 并且我已经安装了最新的驱动程序和最新的OpenCL SDK http software intel com en us articles vcsource tools op
  • GPU 显存带宽理论与实际

    作为在 GPU 上运行的算法分析的一部分 我觉得我正在达到内存带宽的要求 我有几个复杂的内核执行一些复杂的操作 稀疏矩阵乘法 归约等 和一些非常简单的操作 当我计算每个内核读取 写入的总数据时 似乎所有 重要的 都达到了约 79GB s 的
  • 有多少线程(或工作项)可以同时运行?

    我是 GPGPU 编程新手 正在研究 OpenCL 的 NVIDIA 实现 我的问题是如何计算 GPU 设备的限制 线程数 据我了解 有许多工作组 相当于 CUDA 中的块 其中包含许多工作项 cuda 线程 如何获取我的卡上存在的工作组数
  • NVIDIA GPU 的 CUDA 核心和 OpenCL 计算单元之间有什么关系?

    我的电脑有一块 GeForce GTX 960M NVIDIA 声称它有 640 个 CUDA 核心 然而 当我运行 clGetDeviceInfo 来查找计算机中的计算单元数量时 它打印出 5 见下图 听起来 CUDA 核心与 OpenC
  • opencl支持布尔变量吗?

    openCL 支持布尔变量吗 我目前正在使用 JOCL java 编写我的 openCL 调用代码 但我没有看到任何有关布尔值的信息 tl dr 是的 但是你应该在内核函数签名中避免它 是的 但a的大小bool is not定义的 因此 它
  • Linux 上的 OpenCL,集成英特尔图形芯片

    我想用OpenCL在 Debian 8 上 我读到在本页 http streamcomputing eu blog 2011 12 29 opencl hardware support Linux 上不支持 Intel 的 GPU 这篇文章
  • 在 Windows 8 (x64) 中安装期间出现 PyOpenCL“致命错误:CL/cl.h:没有此类文件或目录”错误

    在大量搜索此问题的解决方案后 我发现此特定错误尚未针对 Windows 正确记录 所以我决定将这个问题与解决方案一起发布 抱歉 如果我将其发布在错误的部分 我希望这个解决方案能够帮助用户解决未来 PyOpenCL 安装错误 请注意 此处使用
  • OpenCL 内置函数“选择”

    我不清楚内置 OpenCL 函数的目的是什么select 有人可以澄清一下吗 来自 OpenCL 规范 功能选择 基因型a 基因型b 基因型c 返回 对于向量类型的每个分量 结果 i 如果设置了 c i 的 MSB b i a i 在这种情
  • 有一个不错的 OpenCL 入门套件吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一些经验OpenGL它是可编程管道 我愿意给OpenCL不过 尝试一下 有人可以提出一个很好的集成套件来使用OpenCL 我只知道石英作曲家看起来
  • OpenCL 矩阵乘法应该更快?

    我正在尝试学习如何使 GPU 优化 OpenCL 内核 我以使用本地内存中的方形图块进行矩阵乘法为例 然而在最好的情况下 我只得到了约 10 倍的加速 约 50 Gflops 与 numpy dot 相比 5 Gflops 它使用的是 BL
  • OpenCL 与 OpenMP 性能对比 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否有研究比较 OpenCL 与 OpenMP 的性能 具体来说 我对使用 OpenCL 启动线程的开销成本感兴趣 例如 如果将域分解

随机推荐

  • 具有递归和列表理解的素数生成器

    我是 Haskell 编程的新手 无法理解下面的列表理解如何扩展 primes sieve 2 sieve p xs p sieve x x lt xs x mod p 0 有人可以纠正我如何sieve扩建工程 当我们进行模式匹配时siev
  • 在 Objective-C 框架中导入 Swift 类

    我有一个自定义框架 其中有一堆 Objective C 类 在框架内 我想使用 Swift 添加更多类 但是 当尝试使用以下方法将 Swift 类公开给 Objective C 代码时 MyProduct Swift h 它出现为 MyPr
  • 为数据框中的因素添加额外级别

    我有一个包含数字和有序因子列的数据框 我有很多 NA 值 因此没有为它们分配级别 我将 NA 更改为 无答案 但因子列的级别不包含该级别 所以这是我开始的方式 但我不知道如何以优雅的方式完成它 addNoAnswer function df
  • java IO 异常:流关闭

    这是我目前拥有的代码 public class FileStatus extends Status FileWriter writer public FileStatus try writer new FileWriter status t
  • C++ 匿名命名空间:变量初始化为 0?

    这里有一个相关的未解答的问题 c 未命名命名空间中的变量自动初始化为 0 堆栈溢出 https stackoverflow com questions 6526466 variables auto initialized to 0 in u
  • 即使没有代理,放大初始化错误“无法获取本地颁发者证书”

    我正在尝试初始化放大 但由于网络错误而失败 下面是命令堆栈 amplify init Note It is recommended to run this command from the root of your app director
  • Windows 命令行/shell - 丢弃 UTF-8 BOM

    这个问题还在继续关于有选择地将一个文件中的行附加到另一个文件的另一个问题 https stackoverflow com questions 12838802 windows command line shell while appendi
  • 将 C# 数组传递给 javascript

    我在 c 的 page load 中有一个数组 我想在 java 脚本中访问它 但不知道该怎么做 float energyArray new float count for int i 0 i lt count i energyArray
  • 在 vba (Excel/OneDrive) 中关闭自动保存

    我正在尝试关闭 Excel 文档的自动保存功能 Excel 365 同时将文件保存在 OneDrive 上 做一些研究AutoRecover Enabled False Application 应该是正确的属性 但由于某种原因我无法让它工作
  • JSF:绝对需要将昂贵的业务逻辑放入访问器方法中。如何避免多次调用这种昂贵的BL

    这是我的困境 我知道在 JSF 中访问器方法将被多次调用 因此我知道不要将昂贵的业务逻辑 如数据库访问 放在访问器方法中 如果我绝对必须将业务逻辑放入我的访问器中怎么办 这种情况我该怎么办 以下是我的困境的高级布局 莫贾拉 2 1 GF 3
  • 执行时活动指示器不显示

    我试图在用户点击登录按钮时显示活动指示器 如果我把startActivityIndicator 代码在viewDidLoad 它完全按照预期显示在屏幕上 当我将其作为第一步执行时btnSignIn 它永远不会出现 有点迷失 所以我希望堆栈大
  • 双向非对称加密如何工作?

    假设我们有爱丽丝和鲍勃 Alice 向 Bob 发送一条她用 Bob 的公钥加密的消息 鲍勃是唯一可以使用他的私钥解密它的人 但他如何确定消息来自爱丽丝呢 假设他回复并使用 Alice 的公钥加密他的消息 只有爱丽丝才能解密该消息 但她如何
  • 如何修改 Jersey 过滤器中的查询参数

    根据泽西岛文档 https jersey java net documentation latest filters and interceptors html 当您想要修改任何请求或响应参数 例如标头 时 可以使用过滤器 所以我相信修改查
  • 应用 css 媒体查询进行响应式设计时 css 发生变化

    我正在为我的网站应用 CSS 媒体查询 以便在移动设备和笔记本电脑上工作 我正在使用以下移动媒体查询 media only screen and min device width 321px and max device width 480
  • 单击图像,获取坐标

    我有一个标准的 HTML 图像标签 其中有一个图像 大小为 100 x 100 像素 我希望人们能够单击图像 并将他们单击的 X 和 Y 传递到函数中 坐标需要相对于图像的顶部和左侧 我认为你在谈论
  • kendo ui 服务器中的网格过滤、排序和分页

    我正在使用kendo grid 想要在服务器中执行过滤 排序和分页 我知道我应该添加到数据源 serverPaging true serverSorting true 但是我如何告诉网格 数据源应该使用哪个 url 来进行排序 过滤等 如果
  • 可见窗口高度而不是$(window).height();

    有什么方法可以从内部获取整个页面的可见高度iframe window height 给我iframe身高 如果您使用框架 则可以使用以下方法获取最外面窗口的高度window top在 jQuery 构造函数中 高度为window top h
  • 我的用户站点中的文件夹是否与项目站点冲突?

    GitHub 页面 https pages github com 允许每个用户拥有一个用户站点 也许是主页 并且无限制项目地点 当您设置您的用户站点 you must为存储库命名 username github io where usern
  • 跨换行匹配正则表达式?

    我有一个正则表达式 lt lof lt gt gt 在单行输入上完美工作和匹配 但是 如果输入在两个 部分之间包含换行符 则它根本不匹配 在这种情况下 忽略任何换行符的最佳方法是什么 使用以下命令创建正则表达式对象RegexOptions
  • 确定 OpenCL 工作组大小的限制因素?

    我正在尝试在资源较少的嵌入式 GPU 上运行一些为桌面显卡编写的 OpenCL 内核 特别是 桌面版本假设始终支持至少 256 个工作组大小 但基于 Mali T628 ARM 的 GPU 仅保证 64 工作组大小 事实上 一些内核报告CL