对于缓存的GPU,哪种内存访问模式更有效?

 手机用户2502882485 发布于 2023-02-05 08:12

所以假设我有一个全局内存数组:

|a|b|c| |e|f|g| |i|j|k| |

访问此内存有四个"线程"(OpenCL中的本地工作项),以及此访问的两种可能模式(列是时间片,行是线程):

   0 -> 1 -> 2 -> 3
t1 a -> b -> c -> .
t2 e -> f -> g -> .
t3 i -> j -> k -> .
t4 .    .    . `> .

上述模式将数组拆分为块,每个线程迭代到并访问每个时间片的块中的下一个元素.我相信这种访问适用于CPU,因为它最大化了每个线程的缓存局部性.此外,编译器可以轻松地展开利用此模式的循环.

第二种模式:

   0 -> 1 -> 2 -> 3
t1 a -> e -> i -> .
t2 b -> f -> j -> .
t3 c -> g -> k -> .
t4 .    .    . `> .

上述模式大步访问内存:例如,线程1访问a,然后是e,然后是i等.这样可以最大化每单位时间的缓存局部性.考虑到你在任何给定的时间片上都有64个工作项"跨越".这意味着,如果缓存行大小为64字节且元素为sizeof(float),则工作项1的读取将缓存工作项1的读取.必须仔细选择每个单元的数据宽度/数量(其中'a'是上面的单元)以避免错位访问.这些循环似乎不会轻易展开(或者根本不使用英特尔的内核生成器与CPU).我相信这种模式适用于GPU.

我的目标是具有缓存层次结构的GPU.特别是AMD的最新架构(GCN).第二种访问模式是"合并"的一个例子吗?在某个地方我的思考过程中我错了吗?

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有