OpenCL 何时使用全局、私有、本地、常量地址空间

2024-05-11

我正在尝试学习 OpenCL,但我很难决定使用哪些地址空间,因为我只找到组装的资源声明这些地址空间是什么,但没有声明它们为什么存在或何时使用它们。资源至少太分散了,所以带着这个问题我希望把所有这些信息汇总一下:所有地址空间是什么,它们为什么存在,何时使用哪个地址空间以及内存和性能方面的优点和缺点是什么。

据我了解(这可能太简单了),GPU 有两种物理类型的内存:全局记忆,远离实际的处理器,速度很慢但相当大并且可供所有工作人员使用,并且本地内存,接近实际的处理器,速度很快但很小并且其他工作人员无法访问。

直观地看,local限定符确保变量被放置在本地内存中并且global限定符确保变量被放置在全局内存中,尽管我不确定这到底是发生了什么。这使得private and constant预选赛。那些的目的是什么?

还有一些隐式限定符。例如,规格 https://www.khronos.org/registry/OpenCL/sdk/1.0/docs/man/xhtml/global.html提及通用地址空间,我认为它用于没有限定符的参数。这到底是做什么的?然后还有局部函数变量。它们的地址空间是什么?

这是一个使用我的直觉的例子,但不知道我实际上在做什么:

Example:假设我传递了一个类型数组long长度为 10000 到我只会用来读取的内核,然后我会声明它global const因为它必须可供所有工人使用并且不会改变。我为什么不使用constant预选赛?当通过 CPU 设置该数组的缓冲区时,我实际上也可以将该数组设置为只读,在我看来,这与声明它是一样的const。再说一遍,我何时以及为何要声明某事constant or global const?

当执行内存密集型任务时,将数组复制到内核内部的本地数组会更好吗?我的猜测是本地内​​存太小了,但是如果数组的长度只有 10 怎么办?数组什么时候会太大/太小?更一般地说:什么时候值得将数据从全局内存复制到本地内存?

假设我还想传递这个数组的长度,那么我会添加const int length我的内核的论点,但我不确定为什么我会省略global预选赛除了因为我见过其他人这样做。毕竟,length必须可供所有工人使用。如果我是对的,那么length会有一个通用地址空间,但同样,我真的不知道这意味着什么。

希望有经验的人能解答一下这个问题。这不仅对我来说非常有用,而且我希望对其他想要获得有关 GPU 内存管理的实用知识的爱好者来说也是如此。


持续的:所有工作人员都可以看到缓存的全局内存的一小部分。如果可以的话使用它,只读。

Global:缓慢,所有人都可以看到,读或写。这是所有数据都将结束的地方,因此始终需要对其进行一些访问。

Local:您需要在本地群组中分享一些内容吗?使用本地!您的所有本地工作人员是否都访问相同的全局内存?使用本地! 本地内存仅在本地工作人员内部可见,并且大小有限,但速度非常快。

Private:仅对工作人员可见的内存,将其视为寄存器。默认情况下,所有未定义的值都是私有的。


假设我将一个类型为 long 且长度为 10000 的数组传递给内核,我 只会用于读取,那么我将声明它为全局常量,因为它必须 可供所有工人使用,并且不会改变。我为什么不使用 常量限定符?

事实上,是的,你可以而且应该使用constant预选赛。它将您的数据放置在常量内存中(所有工作人员都可以快速访问的一小部分只读内存)。 GPU 使用它来将统一传输到所有顶点着色器。

当通过CPU为这个数组设置缓冲区时,我实际上也 只是可以使数组只读,在我看来, 与声明它为 const 相同。再说一次,我何时以及为什么要宣布 常量或全局常量?

事实并非如此,当您创建只读缓冲区时,您仅指定 OpenCL 您计划以只读方式使用它,因此它可以在后面进行优化,但您实际上可以从内核写入它。global const只是开发者的一个保障,所以你不小心写入它,它就会在编译时给出错误。 基本上与纯 C 主机端计算相同。如果所有内存都是非常量的,程序也能正常工作。

当执行内存密集型任务时,将数组复制到内核内部的本地数组会更好吗?我的猜测是本地内​​存太小了,但是如果数组的长度只有 10 怎么办?数组什么时候会太大/太小?更一般地说:什么时候值得将数据从全局内存复制到本地内存?

只有所有工人都阅读它才有价值。如果每个worker读取全局内存的单个值,那么这是不值得的。 这里有用:

Worker0 -> Reads 0,1,2,3
Worker1 -> Reads 0,1,2,3
Worker2 -> Reads 0,1,2,3
Worker3 -> Reads 0,1,2,3

在这里没用:

Worker0 -> Reads 0
Worker1 -> Reads 1
Worker2 -> Reads 2
Worker3 -> Reads 3

假设我还想传递这个数组的长度,那么我会添加 const int length 到我的内核参数,但我不确定为什么我 会省略全局限定符,除非我见过其他的 人们这样做。毕竟,长度必须对所有工人来说都是可访问的。如果 我是对的,那么 length 将有一个通用的地址空间,但同样, 我真的不知道这意味着什么。

当您未在内核参数中指定限定符时,它通常默认为constant,这就是您希望这些小元素能够被所有工作人员快速访问。

OpenCL 编译器通常遵循的内核参数规则是:如果它只读取并适合常量,则常量,否则全局。

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

OpenCL 何时使用全局、私有、本地、常量地址空间 的相关文章

  • Objective-C 使用字符串池吗?

    我知道Java https stackoverflow com questions 3801343 what is string pool in java and C http msdn microsoft com en us librar
  • Chrome 内存/垃圾收集问题

    我在使用 Chrome 时遇到内存 垃圾收集问题 我正在开发一个照片上传网站 该网站允许我的客户使用 HTML5 和文件 API 拖放照片进行上传 因此这在 IE 中不起作用 它仅适用于 Chrome 和 FF 我还没有在 Safari O
  • python中的内存错误

    Traceback most recent call last File run 1341144766 1067082874 solution py line 27 in main File run 1341144766 106708287
  • Android - WindowManager 导致崩溃并显示“窗口数超过最大 300”

    我看到我的日志软件中报告了此错误 但无法确定导致该错误的原因 或者 300 限制指的是什么 视图数或列表中可能显示的项目数 这就是我可以从日志中获取的全部内容 window count is over max 300 android vie
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • iOS 视图控制器内存在被关闭后未释放

    当用户单击按钮时 它会显示一个带有两个视图控制器的新选项卡栏视图控制器 我是这样做的 ACLevelDownloadController dvc ACLevelDownloadController alloc initWithNibName
  • 从应用程序内部监视 ASP.NET 应用程序内存

    我正在寻找一种方法让应用程序本身监视它正在使用的内存量 这样我就可以每小时左右将其记录在日志文件中 并密切关注应用程序的使用情况 它全部托管 因此我们可以对系统进行更改以查看发生了什么 因此解决方案必须来自应用程序代码内 我们将来可能会使用
  • 是否有 java.lang.String 的内存高效替代品?

    看完之后这篇旧文章 http www javaworld com javaworld javatips jw javatip130 html page 2测量几种对象类型的内存消耗 我惊讶地发现有多少内存String在Java中的使用 le
  • 监控子进程的内存使用情况

    我有一个 Linux 守护进程 它分叉几个子进程并监视它们是否崩溃 根据需要重新启动 如果父进程可以监视子进程的内存使用情况 以检测内存泄漏并在超出一定大小时重新启动子进程 那就太好了 我怎样才能做到这一点 您应该能够从 proc PID
  • 如何在WinMobile6上启用ARMv6非对齐访问?

    ARMv6 引入了一个很棒的功能 未对齐的内存访问 这使得代码中的某些事情变得更加简单和更快 但微软只在winCE6中提供了API 现在大多数 PDA 都基于 WinMobile6 基于 CE 5 x 默认情况下禁用未对齐访问 我尝试在 C
  • C - 为什么我无法映射较小(256UL 或更小)的内存?

    请告诉我 为什么我的简单应用程序无法映射较小的内存 而且 为什么有这样一个特定的边界 257UL define MAP SIZE 256UL or below fail define MAP SIZE 257UL ok include
  • C++ 类的互斥成员导致编译错误

    我不确定为什么当我向 myClass 添加互斥体成员时会发生这种情况 在本例中为 mu Error C2661 std tuple lt void thiscall MyNameSpace myClass void MyNameSpace
  • Node.js 进程内存不足错误

    FATAL ERROR CALL AND RETRY 2 Allocation Failed process out of memory 我看到这个错误 但不太确定它来自哪里 我正在从事的项目有以下基本工作流程 从其他来源接收 XML 帖子
  • 存储整数列表的最有效方法

    我最近一直在做一个项目 其中一个目标是使用尽可能少的内存来使用 Python 3 存储一系列文件 除了一个整数列表之外 几乎所有文件都占用很少的空间 大致333 000整数长且整数可达约8000在尺寸方面 我目前正在使用pickle存储列表
  • Android - 内存泄漏还是?

    两天前我注意到一些事情 我在地图活动上有一个旋转器 在活动的 OnCreate 方法中 我用数据填充微调器 之后 我在 DDMS 中启动堆分析器 开始打开 关闭微调器 我注意到当我打开旋转项时虚拟机分配内存 但是当我关闭它时 虚拟机不会释放
  • 在Python中计算内存碎片

    我有一个长时间运行的进程 不断分配和释放对象 尽管正在释放对象 但 RSS 内存使用量会随着时间的推移而增加 如何计算发生了多少碎片 一种可能性是计算 RSS sum of allocations 并将其作为指标 即便如此 我该如何计算分母
  • 32位进程在64位操作系统上可以访问多少内存?

    在 Windows 上 正常情况下 32 位进程只能访问 2GB RAM 或通过 boot ini 文件中的特殊开关访问 3GB 在 64 位操作系统上运行 32 位进程时 有多少可用内存 是否有任何特殊的开关或设置可以改变这种情况 默认
  • 清除通过在 IPython 中绘图分配的内存

    我正在 IPython QtConsole 和 Notebook 中绘制一些大图 这些占用了大量的内存 但是一旦它们被绘制出来 我就不再需要它们了 它们就可以走了 我怎样才能释放内存 None以下作品 close clf cla reset
  • 如何解决内存分段并强制FastMM释放内存给OS?

    注意 32 位应用程序不计划迁移到 64 位 我正在使用一个非常消耗内存的应用程序 并且几乎优化了与内存分配 取消分配相关的所有相关路径 应用程序本身没有内存泄漏 没有句柄泄漏 没有任何其他类型的泄漏 据我所知并经过测试 我无法触及的第 3

随机推荐

  • macOS 更新后 Jenkins 用户消失

    我在 Mac 上运行 Jenkins 作为 CI 服务器 使用用户 jenkins 的典型设置 它在 macOS 10 12 上运行良好 今天我将 macOS 升级到 10 13 High Sierra 升级过程完成后 Jenkins 无法
  • AWS Textract InvalidParameterException

    我有一个 Net core 客户端应用程序 根据 AWS 文档 使用带有 S3 SNS 和 SQS 的 amazon Textract 检测和分析多页文档中的文本 https docs aws amazon com texttract la
  • Android:如何停止监听电话监听器? [复制]

    这个问题在这里已经有答案了 可能的重复 Android 为什么 PhoneCallListener 在活动完成后仍然存在 https stackoverflow com questions 11666853 android why phon
  • 如何在 Google 地图中创建自定义地图?

    我正在尝试创建一个包含我家地图的 Google 地图应用程序 卧室 浴室 厨房等 使用 GPS 我会找到我现在在家里的位置 并尝试获取到我卧室的方向 步行距离 您可以使用Google的API来获取方向 我需要知道的是 如何添加我家的自定义地
  • Eclipse :: 在“打开资源”对话框中隐藏 .svn 文件

    是否可以在 Eclipse 的 打开资源 对话框 Ctrl Shift R 中隐藏 svn 文件 当你有数百个文件时 这是非常烦人的 Cheers 请尝试以下操作 项目 gt 属性 gt 资源 gt 资源过滤器 gt 添加 选择 排除全部
  • Solr:在带有空格的字符串上使用通配符

    我的问题与这里讨论的问题基本相同 带空格的 Solr 通配符查询 https stackoverflow com questions 10023133 solr wildcard query with whitespace 但这个问题没有得
  • Mandrill 通过 REST API 作为单独的消息发送给多人

    我正在尝试使用山魈发送邮件 问题是 当我将多个收件人添加到 收件人 参数时 它会多次向 收件人 列表中的所有收件人发送同一封邮件 我期望将相同的邮件单独发送给列表中的每个人 我错过了什么吗 key app key template name
  • C# 中的抽象类和接口类有什么不同?

    C 中的抽象类和接口类有什么不同 An 接口不是类 它只是一个contract定义了public一个类的成员must实施 抽象类只是一个类 您从中可以cannot创建一个实例 通常您会使用它来定义一个基类 该基类定义了一些virtual方法
  • 将包含多个事件的 ICS 文件保存到我的日历,而不是其他日历

    当我将 Excel 电子表格转换为 CSV 文件时 然后将 CSV 文件转换为 ICS 文件 我可以打开其中包含单个事件的 ICS 文件 并接受会议邀请 然后将其添加到我的日历中 使用此应用程序进行转换 http icsconverterw
  • 线性代数如何在算法中使用?

    我的几个同行都提到 学习算法时 线性代数 非常重要 我研究了各种算法并学习了一些线性代数课程 但我没有看到其中的联系 那么线性代数如何应用在算法中呢 例如 图的连接矩阵可以带来哪些有趣的事情 三个具体例子 线性代数是现代 3D 图形的基础
  • X 请求失败错误:BadAlloc(操作资源不足)

    我注意到这个问题过去已经被问过很多次 并且在网上冲浪时我发现了很多关于它的页面 然而 似乎提出的解决方案很少起作用 就我而言 问题并不涉及我编写的程序 所以我会在这里再试一次 我最近在我的笔记本电脑上安装了 Linux Mint 14 当操
  • 如何知道一个点是否在复杂的 3D 形状内(.ply 文件)

    我正在研究一个Java女巫项目真是要了我的命 经过几天在不同论坛上的研究 寻找我真正需要的东西 我来寻求你的帮助 我的数据 ply 文件 包含由许多三角形组成的 3D 形状 一个点 3D坐标 我想知道这个点是否包含在复杂的 3D 形状内 我
  • 重构 google 的 NetworkBoundResource 类以使用 RxJava 而不是 LiveData

    谷歌的android架构组件教程here https developer android com topic libraries architecture guide html有一部分解释了如何抽象通过网络获取数据的逻辑 在其中 他们使用
  • AWS LoadBalancer监听多个端口

    我有一些应用程序在 aws 中作为微服务运行 其中一些在端口 80 上运行 一些在端口 3000 上运行 我希望我的 ALB 侦听这两个端口上的流量 然后我有一个ListenRules将流量引导至微服务 我想实现如下所示的目标 Resour
  • emacs 临时文件的 .gitignore 正则表达式

    我正在尝试 gitignore emacs 临时 自动保存文件 我在用着 在我的 gitignore 中 But git add A在子文件夹中运行仍然给我 new file make collections py new file nor
  • 如何列出 Git 1.7+ 中的所有远程分支?

    我试过了git branch r 但这仅列出我在本地跟踪的远程分支 如何找到我没有的列表 命令是否列出对我来说并不重要all远程分支或仅那些未跟踪的分支 For the vast majority 1 of visitors here th
  • 使用 match every contains 进行 json 数组项断言

    我想在响应数组下的每个项目中添加包含 训练 的技能数组断言 我怎样才能使用匹配每种格式来做到这一点 match each response contains password abc123 不使用 JsonPath 表达式 我预计下面的示例
  • 为什么 BinaryFormatter 可以序列化 Action<> 但 Json.net 不能

    尝试序列化 反序列化 Action 尝试我的 1天真 JsonConvert SerializeObject myAction JsonConvert Deserialize
  • 将文本数据作为表单中的文件发布

    是否可以从 html 表单中发布一些作为文件输入类型的字符串的 XML 数据 情况是我有一个像这样的表格 form action target php method post enctype multipart form data gt
  • OpenCL 何时使用全局、私有、本地、常量地址空间

    我正在尝试学习 OpenCL 但我很难决定使用哪些地址空间 因为我只找到组装的资源声明这些地址空间是什么 但没有声明它们为什么存在或何时使用它们 资源至少太分散了 所以带着这个问题我希望把所有这些信息汇总一下 所有地址空间是什么 它们为什么