查找表的CUDA内存

时间:2013-06-13 13:35:59

标签: cuda lookup-tables

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

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

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

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

修改

只是为了澄清:我需要存储大约10个不同的4KB查找表。无论如何,知道更好的解决方案将是很好的,因为对于这种情况,对于例如对于这种情况的情况是相同的。 100个4KB表格或与10个16KB的查找表。

1 个答案:

答案 0 :(得分:2)

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

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

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

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