【发布时间】:2012-12-04 16:23:51
【问题描述】:
我需要大量的常量数据,超过 6-8 KB,最大到 16 KB。同时我不使用共享内存。现在我想将这个常量数据存储在共享内存中。这是个好主意吗?任何性能近似值?广播是否适用于共享内存和常量?
性能对应用程序至关重要。而且我认为,我的 Tesla C2075 (CUDA 2.0) 上只有 8 KB 常量内存缓存
【问题讨论】:
-
为什么不直接使用常量内存?
-
常量数据的访问模式是什么——所有线程是否同时访问同一个常量位置?
-
您的机器上的恒定内存最高可达 64KB。您所指的 8KB 数字是每个 SM 硬件资源,而不是实际可映射的数量。正如@PaulR 指出的那样,访问模式将是一个考虑因素。共享内存可以很好地与广播(每个线程访问相同内存位置)或合并(每个线程访问连续/连续内存位置)内存访问模式一起工作。只有当每个线程在给定时间访问相同的内存位置时,常量内存才能真正发挥作用。
-
感谢 cmets!我知道大约 64KB 大小,但是“硬件资源”是什么意思?我想,它只是每个 SM 的一个缓存,如果你使用超过 8 KB 的常量内存,它会很慢,对吗?关于访问模式,好吧,所有线程都不会访问相同的位置,至少并非总是如此。这是否意味着,常量内存(和未合并的共享)会很慢,对我来说最好的方法是共享合并模式?
-
如果你有 1MB 的 CPU 缓存,是否意味着你只能访问 1MB 的数据?您可以访问超过 1MB,但缓存的有效性将取决于访问模式。对于 GPU 常量内存,最大可映射空间为 64KB。有 8KB 的硬件缓存(每个 SM)将尝试缓存该空间,具体取决于访问模式。访问超过 8KB 可能会也可能不会很慢,这取决于位置和重用。在概念上与 CPU 缓存没有什么不同。如果线程访问不同的位置(在代码中的给定点),常量 mem 不是一个好的选择。
标签: cuda