gpt4 book ai didi

用于查找表的 CUDA 内存

转载 作者:行者123 更新时间:2023-12-04 12:48:14 26 4
gpt4 key购买 nike

我正在设计一组数学函数并在 CPU 和 GPU(使用 CUDA)版本中实现它们。

其中一些函数基于查找表。大多数表占用 4KB,其中一些占用更多。基于查找表的函数接受一个输入,选择查找表的一两个条目,然后通过内插或应用类似的技术来计算结果。

我现在的问题是:我应该在哪里保存这些查找表? CUDA 设备有许多用于存储值的地方(全局内存、常量内存、纹理内存等)。假设每个表可以被多个线程并发读取,并且输入值以及查找索引在每个扭曲的线程之间可以完全不相关(导致不相关的内存访问),哪个内存提供最快的访问?

我补充说,这些表的内容是预先计算好的并且完全不变。

编辑

澄清一下:我需要存储大约 10 个不同的 4KB 查找表。无论如何,很高兴知道对于这种情况的解决方案是否与例如的情况相同100 个 4KB 表或带有例如10 个 16KB 查找表。

最佳答案

纹理内存(现在称为只读数据缓存)可能是一个值得探索的选择,尽管不是为了插值的好处。它支持 32 位读取,而不会超过此数量的读取。但是,您总共限制为 48K。对于 Kepler(计算 3.x),现在编程非常简单。

除非您在 32 位模式下配置全局内存,否则通常会为每个线程拖入 128 字节,由于您(显然)无法合并内存访问,因此大大增加了内存中实际需要的数据。因此,如果您想使用超过 48K(您提到 40K),那么 32 位模式可能就是您所需要的。

考虑合并,如果您要从这些表中连续访问一组值,您可能能够交错这些表,以便这些组合可以分组并读取为每个线程的 64 位或 128 位读取。这意味着从全局内存中读取 128 字节可能很有用。

您将遇到的问题是您通过使用查找表来限制解决方案内存带宽。将 L1 缓存大小(在 Fermi/compute 2.x 上)更改为 48K 可能会产生显着差异,尤其是在您不使用其他 32K 共享内存的情况下。在 32 位模式下尝试纹理内存和全局内存,看看哪种最适合您的算法。如果您可以选择硬件,最后选择具有良好内存带宽数字的卡。

关于用于查找表的 CUDA 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17088484/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com