3

在共享内存中存储常量值有什么好处吗?例如:

A[tid] = CONSTANT * B[tid],

其中 A 和 B 是数组,CONSTANT 是常数值,例如 4。tid 是线程索引(数组元素 = 单线程)。

每个线程都必须读取 value CONSTANT,所以共享内存应该很有用,对吧?

我认为它是如何工作的:从全局内存中读取会消耗大量时间,因此从全局内存中读取一次常量值到共享内存,然后线程可以快速读取它。因为有很多线程(必须多次读取常量值)共享内存应该加快速度。

4

2 回答 2

4

一些 CPU 指令集,例如 x86,支持将完整大小的常量存储为与操作码本身交错的操作数。在这种情况下,这些常量显然是与 CPU 正在运行的其余指令流一起读入的,而且将它们存储在其他任何地方似乎不太可能更快。

其他架构,例如 ARM,支持在操作码中存储小的常量和移位值。程序中通常需要的大多数常量可以表示为一个小常量加上一个移位值,因此可以直接存储在操作码中。

我不知道 SASS(NVIDIA GPU 的本机指令集)是否支持这种“嵌入式”常量。

但请考虑,如果您将常量存储在共享内存中,您将需要引用该常量,并且该引用本身将是一个常量,或者它将派生自一个常量(例如基地址)。

此外,还有一个用于指定为常量的值的缓存。您可以通过在调用内核之前在常量内存中设置值来利用此缓存。

此外,首先考虑在共享内存中设置常量的开销。共享内存中的值只能在块中的线程内共享,因此每个块都必须重新设置常量。因为线程以 32 个一组运行,称为 warp,内核将占用 32 个线程来设置常量,每次处理都在一个新块上开始。

总而言之,我认为最好让编译器处理单个常量,例如您的示例中的常量,并使用常量内存来存储您可能拥有的任何常量数组。

于 2012-06-11T21:31:00.993 回答
1

恒定的内存空间被缓存,具有很高的读取性能。所以我怀疑将它存储在共享内存中会有很大的性能差异。

于 2012-06-12T00:13:13.210 回答