CUDA编程:存储器模型

版权声明:本文为博主原创文章,未经作者允许请勿转载。 https://blog.csdn.net/heiheiya https://blog.csdn.net/heiheiya/article/details/81559413

1. 每个线程拥有自己的register和local memory。

Register是GPU片上的高速缓存器,执行单元可以以极低的延迟访问寄存器。Local memory也是私有的,如果register被消耗完,数据将被存储在local memory中。如果每个线程使用了过多的register,或声明了大型结构体或数组,或者编译器无法确定数组的大小,线程的私有数据就有可能会被分配到local memory中。Local memory的数据被保存在显存中,而不是片上的register或者缓存中,所以访问local memory的速度很慢。

2. 每个block拥有shared memory。

Shared memory也是GPU片内的高速存储器。它是一块可以被同一block中的所有线程访问的可读写存储器。访问shared memory的速度几乎和访问register一样快,是实现线程间通信的延迟最小的方法。

3. grid中的所有线程可以访问一块global memory。

Global memory位于显存,CPU、GPU都可以进行读写访问。Global memory能够提供很高带宽,但同时也具有较高的访存延迟。

4. 此外,还有两种可以被所有线程访问的只读存储器:constant memory和texture memory。

Constant memory是只读的地址空间,位于显存,但拥有缓存加速。Constant memory的空间较小,用于存储需要频繁访问的只读参数。

Texture memory是由GPU用于纹理渲染的图形专用单元发展而来,并不是一块专门的存储器,而是牵涉到显存、两级纹理缓存、纹理拾取单元的纹理流水线。

下表是它们的访问权限,生存周期。

运行CUDA samples的deviceQuery可以打印出memory的信息。

猜你喜欢

转载自blog.csdn.net/heiheiya/article/details/81559413