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 何时使用全局、私有、本地、常量地址空间 的相关文章

  • 如何计算汇编中的内存位移?

    我一直在研究 yasm 汇编语言 并生成了一个包含以下内容的列表文件 我需要帮助理解第一列中的内存位移是如何计算的 提前致谢 1 line 1 1 memory asm 2 section data 3 00000000 04000000
  • 指针的 Fortran 副本

    我有一个包含指针 p 的 var 类型 我需要将 var 复制到与 var 类型相同的另一个变量 var1 上 通过执行 var1 var 在引号中 因为我不知道这是否是正确的方法 请参见下文 在我的实现中 var 和 var1 被传递给一
  • MemoryStream“内存不足”C#

    我有一个自定义数据对象 虚拟文件 的实现see here https stackoverflow com questions 4024657 how to drop a file from windows formlistview to d
  • 用eclipse测试java程序的内存消耗[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 open CL 中将结构数组传递给内核

    你好 我正在尝试在 open CL 中实现距离向量程序 基本上我在将结构数组作为参数传递到内核时遇到问题 我的结构定义是这样的 typedef struct int a nodes 4 node node srcA 为此分配内存后 我使用此
  • 如何检查两个变量是否指向内存中的同一个对象?

    例如 struct Foo lt a gt bar a str fn main let foo instance Foo bar bar let some vector Vec lt Foo gt vec foo instance asse
  • 用于计算邻居列表的最佳 GPU 算法

    给定 3D 中数千个点的集合 我需要获取落在某个截止值 以欧几里得距离而言 内的每个粒子的邻居列表 并且如果可能的话 从最近到最远排序 在 CUDA 或 OpenCL 语言中 哪种 GPU 算法最快 我所知道的最快的 GPU MD 代码之一
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • 清除通过在 IPython 中绘图分配的内存

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

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

    我正在制作一个应用程序 它创建大量的窗口控件 按钮和标签等 它们都是通过函数动态生成的 我遇到的问题是 当我删除控件并处置它们时 它们不会从内存中删除 void loadALoadOfStuff while tabControlToClea
  • “calloc”不会自动消耗 RAM 中的内存

    根据这个问题的回答 malloc 和 calloc 之间的区别 https stackoverflow com questions 1538420 difference between malloc and calloc answer 15
  • Python int和float在64位系统中的内存消耗

    我正在 Python 3 4 的 64 位系统中尝试以下代码 以了解不同原始数据类型的内存消耗 import sys print sys getsizeof 45 prints 28 print sys getsizeof 45 2 pri
  • 如何序列化 android.graphics.Path 对象

    我正在尝试将 Android graphics Path 对象存储在内部设备内存中 有谁知道如何序列化 android graphics Path 对象 另外 还有其他方法来存储 Path 对象吗 谢谢 我这样做的方法是从原始 Path 类
  • SQLite 性能基准 - 为什么 :memory: 这么慢...只有磁盘速度的 1.5 倍?

    为什么 sqlite 中的 memory 这么慢 我一直在尝试查看使用内存中的 sqlite 与基于磁盘的 sqlite 是否可以获得任何性能改进 基本上我想用启动时间和内存来换取非常快速的查询not在应用程序过程中击中磁盘 然而 以下基准
  • C# 应用程序可以使用多少 RAM? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • OpenCL 研究/学术论文

    我即将在大学开始关于 OpenCL 的荣誉项目 以及如何利用它来改进现代游戏开发 我知道现在 很快就会有几本关于学习 opencl 的书 但我想知道是否有人知道关于 opencl 的任何好的论文 我一直在寻找 但似乎找不到任何东西 我的项目
  • 如何在 opencv 3.0 Beta 中从文件读取 UMat?

    我想用UMat所以我的代码可以使用 OpenCL OpenCV 3 0 0 Beta 在 GPU 和 CPU 上运行 但我找不到将图像文件读入的方法UMat或转换一个Mat to UMat 如何将图像读入UMat 样品用于Mat to UM
  • Python列表内存存储[重复]

    这个问题在这里已经有答案了 据我了解 Python 列表本质上是 C 数组 它们分配特定的顺序内存块 但是 这些内存块实际上存储列表中的数据还是它们只是指向内存中存储实际数据的另一个位置 它可能取决于列表中存储的对象的大小吗 因为您可以轻松
  • MySQL用户创建的临时表已满

    我使用内存引擎创建了一个临时表 如下所示 CREATE TEMPORARY TABLE IF NOT EXISTS some text id INT DEFAULT 0 string varchar 400 DEFAULT engine m

随机推荐

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