Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cuda 共享内存和常量_Cuda - Fatal编程技术网

Cuda 共享内存和常量

Cuda 共享内存和常量,cuda,Cuda,在共享内存中存储常量值有什么好处吗?例如: A[tid]=常数*B[tid] 其中A和B是数组,常量是常量值,例如4。tid是线程索引(数组元素=单线程) 每个线程都必须读取值常量,所以共享内存应该很有用,对吗 我认为它是如何工作的: 从全局内存中读取会消耗大量时间,所以将全局内存中的constatnt值读取一次到共享内存,然后线程就可以快速读取它。由于有许多线程(常量值必须被多次读取),共享内存应该可以加快速度。一些CPU指令集,如x86,支持将全尺寸常量存储为操作数,并与操作码本身交错。在这

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

A[tid]=常数*B[tid]

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

每个线程都必须读取值
常量
,所以共享内存应该很有用,对吗

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

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

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

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

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

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

进一步,首先考虑将常数设置在共享内存中的开销。共享内存中的值只能在块中的线程内共享,因此每个块都必须重新设置常量。由于线程以32个线程(称为warp)为一组运行,因此每次处理在新块上启动时,内核在设置常量时都会占用32个线程


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

常量内存空间被缓存,并且具有很高的读取性能。因此,我怀疑将其存储在共享内存中会有很大的性能差异。

各种GPU指令集提供了立即值,以便在某些指令中进行编码,包括整数指令和浮点指令。在可能的情况下,编译器将利用这一点作为编译时常量。如果一个常量不能嵌入到指令中,编译器可以将其放入一个常量库中,该数据可以由常量缓存进行缓存,该缓存具有广播功能,可以同时向一个warp中的所有trhead提供相同的常量。因此,对于单个常量,可以简单地依赖于编译器。