每个工作项的 Opencl 最大私有内存大小

如何解决每个工作项的 Opencl 最大私有内存大小

我有一台 AMD RX 570 4G, Opencl 告诉我,我最多可以使用 256 个工作组和每组 256 个工作项...

假设我使用了所有 256 个工作组,每个工作组中有 256 个工作项,

现在,每个工作项的最大私有内存大小是多少?

私有内存是否等于总 VRAM(4GB)除以总工作项(256x256)?

或者是否等于Cache,如果是这样,如何?

解决方法

私有内存空间是 GPU 芯片上的寄存器(0 周期访问延迟),与 VRAM(全局内存空间)的数量完全无关。私有内存的数量取决于设备(每个计算单元的私有内存)。 我不知道 RX 570 的专用内存大小,但对于较旧的 HD7000 系列 GPU,它是每个 CU 256kB。如果您的工作组大小为 256,则每个工作项将获得 1kB,这等于 256 个浮点变量。

缓存大小决定了本地和常量内存空间的大小。

,

VRAM 在 OpenCL 中表示为全局内存。

私有内存最初是从寄存器文件中分配的。您的 RX 570 来自 AMD 的 Polaris 架构,也就是 GCN 4,其中每个计算单元(64 个着色器处理器)可以访问 256 个向量 (SIMD) 寄存器(64x32 位宽)和 512 个 32 位标量寄存器。因此,每个 CU 大约需要 66KiB,但这并不像引用总数那么简单。

一个工作组总是被安排在一个计算单元上,所以如果你给它分配 256 个工作项,那么它必须按顺序执行每条向量指令 4 次 (64 x 4 = 256),向量寄存器将 (稍微简化)实际上必须被视为 64 256 个条目的寄存器。

标量寄存器用于在每个工作项上相同的数据和计算,例如增加循环计数器,保存缓冲区基指针等

如果您使用的内存超过寄存器文件的容量,私有内存通常会溢出到全局。所以性能只会下降。

所以本质上,在 GCN 上,您的最佳工作组大小通常是 64。尽可能少地使用私有内存;绝对要减少可用寄存器文件的一半,以便可以安排多个工作组,从而消除内存访问的延迟,否则您的着色器核心将花费大量时间等待数据到达或写出。

缓存用于 OpenCL 本地和常量内存空间。 (如果您尝试使用太多,常量将再次溢出到全局。可以通过 OpenCL API 检查本地内存的大小,并再次在同一计算单元上安排的工作组之间进行分配,因此如果您使用超过一半,则只有一个组可以在 CU 等上运行)

我不知道您从哪里获得 256 个工作组的限制,该限制主要取决于 GPU 使用 32 位还是 64 位寻址。即使在 32 位情况下,大多数应用程序也不会接近 40 亿个工作项。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-