c - 我们是否需要考虑 CUDA 的缓存抖动?

标签 c caching memory optimization cuda

我不熟悉 GPU 内存缓存的工作原理,因此想知道与 CPU 相关的内存访问在时间和空间上接近的假设是否也适用于 GPU。也就是说,在 CUDA C 中编程,我是否需要考虑 C 的行优先数组存储格式以防止缓存抖动?

非常感谢。

最佳答案

是的,非常喜欢。

假设您要为每个线程获取 4 字节整数。

场景一

每个线程正在获取一个整数及其线程 ID 的索引。这意味着线程 0 正在获取 a[0],线程 1 正在获取 a[1] 等等......与 GPU 一样,它将获取 128 字节的缓存行。巧合的是,warp 是 32 个线程,因此 32*4 = 128 字节。这意味着对于一个 warp,它将一次从内存中提取请求。

场景二

如果线程以完全随机的顺序获取,索引之间的距离大于 128 字节。它必须发出 32 个 128 字节的内存请求。这意味着您将为每个 warp 填充缓存 32 倍的内存,如果您的问题很大,您的缓存将比场景一多 32 次失效。

这意味着,如果您在场景一中请求通常驻留在缓存中的内存,那么在场景二中,它很可能必须通过来自全局内存的另一个内存请求来解决。

关于c - 我们是否需要考虑 CUDA 的缓存抖动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14095397/

相关文章:

c - 深层复制 - void** 的元素 - 结构体成员

caching - 缓存大小和 block 大小是多少?

PHP 响应缓存 : file vs MySQL

c++ - 为什么在调用 reset() 时,通过 unique_ptr 创建的内存没有被正确删除?

c - mingw 是否允许在没有 page_execute 的情况下执行字节数组?

c - delphi 中使用列表中的循环单元引用是否可行?

在内存中将 BMP 文件转换为 PNG 文件

python - 为什么某些 mysql 连接在删除 + 插入后选择 mysql 数据库中的旧数据?

C++11 原子内存排序 - 这是宽松(释放-消费)排序的正确用法吗?

c - 数组百分比算法实现