前两天楼主面试时被问到CUDA内存类型的问题,关于各种缓存的问题没怎么弄清楚,乱答了一通。。。
CUDA存储器类型:
每个线程拥有自己的register and loacal memory;
每个线程块拥有一块shared memory;
所有线程都可以访问global memory;
还有,可以被所有线程访问的只读存储器:constant memory and texture memory
1、 寄存器Register
寄存器是 GPU上的高速缓存器 ,其基本单元是寄存器文件,每个寄存器文件大小为32bit.
Kernel中的局部(简单类型)变量第一选择是被分配到Register中。
特点:每个线程私有,速度快。
2、 局部存储器 local memory
当register耗尽时,数据将被存储到local memory。如果每个线程中使用了过多的寄存器,或声明了大型结构体或数组,或编译器无法确定数组大小,线程的私有数据就会被分配到local memory中。
特点:每个线程私有; 没有缓存 ,慢。
注:在声明局部变量时,尽量使变量可以分配到register。如:
unsigned int mt[3];
改为: unsigned int mt0, mt1, mt2;
3、 共享存储器 shared memory
可以被同一block中的所有线程读写
特点:block中的线程共有;访问共享存储器 几乎与register一样快 .
4、 全局存储器 global memory
特点:所有线程都可以访问; 没有缓存 ( 注:按手册上的说法,计算能力2.0以上也的也是有缓存的 )
5、 常数存储器constant memory
用于存储访问频繁的只读参数
特点:只读; 有缓存 ;空间小(64KB)
注:定义常数存储器时,需要将其定义在所有函数之外,作用于整个文件
6、 纹理存储器 texture memory
是一种只读存储器,其中的数据以一维、二维或者三维数组的形式存储在显存中。在通用计算中,其适合实现图像处理和查找,对大量数据的随机访问和非对齐访问也有良好的加速效果。
特点: 具有纹理缓存 ,只读。
CUDA存储器类型:
每个线程拥有自己的register and loacal memory;
每个线程块拥有一块shared memory;
所有线程都可以访问global memory;
还有,可以被所有线程访问的只读存储器:constant memory and texture memory
1、 寄存器Register
寄存器是 GPU上的高速缓存器 ,其基本单元是寄存器文件,每个寄存器文件大小为32bit.
Kernel中的局部(简单类型)变量第一选择是被分配到Register中。
特点:每个线程私有,速度快。
2、 局部存储器 local memory
当register耗尽时,数据将被存储到local memory。如果每个线程中使用了过多的寄存器,或声明了大型结构体或数组,或编译器无法确定数组大小,线程的私有数据就会被分配到local memory中。
特点:每个线程私有; 没有缓存 ,慢。
注:在声明局部变量时,尽量使变量可以分配到register。如:
unsigned int mt[3];
改为: unsigned int mt0, mt1, mt2;
3、 共享存储器 shared memory
可以被同一block中的所有线程读写
特点:block中的线程共有;访问共享存储器 几乎与register一样快 .
4、 全局存储器 global memory
特点:所有线程都可以访问; 没有缓存 ( 注:按手册上的说法,计算能力2.0以上也的也是有缓存的 )
5、 常数存储器constant memory
用于存储访问频繁的只读参数
特点:只读; 有缓存 ;空间小(64KB)
注:定义常数存储器时,需要将其定义在所有函数之外,作用于整个文件
6、 纹理存储器 texture memory
是一种只读存储器,其中的数据以一维、二维或者三维数组的形式存储在显存中。在通用计算中,其适合实现图像处理和查找,对大量数据的随机访问和非对齐访问也有良好的加速效果。
特点: 具有纹理缓存 ,只读。