CUDA内存类型memory

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

http://www.cnblogs.com/traceorigin/archive/2013/04/11/3015482.html

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一样快.

//u(i)= u(i)^2 + u(i-1)//Static__global__ example(float* u) {    int i=threadIdx.x;    __shared__ int tmp[4];     tmp[i]=u[i];     u[i]=tmp[i]*tmp[i]+tmp[3-i];}int main() {    float hostU[4] = {1, 2, 3, 4};    float* devU;    size_t size = sizeof(float)*4;    cudaMalloc(&devU, size);    cudaMemcpy(devU, hostU, size,    cudaMemcpyHostToDevice);    example<<<1,4>>>(devU, devV);    cudaMemcpy(hostU, devU, size,    cudaMemcpyDeviceToHost);    cudaFree(devU);    return 0;}//Dynamicextern __shared__ int tmp[];__global__ example(float* u) {    int i=threadIdx.x;     tmp[i]=u[i];     u[i]=tmp[i]*tmp[i]+tmp[3-i];}int main() {    float hostU[4] = {1, 2, 3, 4};    float* devU;    size_t size = sizeof(float)*4;    cudaMalloc(&devU, size);    cudaMemcpy(devU, hostU, size, cudaMemcpyHostToDevice);    example<<<1,4,size>>>(devU, devV);    cudaMemcpy(hostU, devU, size, cudaMemcpyDeviceToHost);    cudaFree(devU);    return 0;}
 

 4、  全局存储器 global memory

  特点:所有线程都可以访问;没有缓存

//Dynamic__global__ add4f(float* u, float* v) {int i=threadIdx.x; u[i]+=v[i];}int main() {    float hostU[4] = {1, 2, 3, 4};    float hostV[4] = {1, 2, 3, 4};    float* devU, devV;    size_t size = sizeof(float)*4;    cudaMalloc(&devU, size);    cudaMalloc(&devV, size);    cudaMemcpy(devU, hostU, size,    cudaMemcpyHostToDevice);    cudaMemcpy(devV, hostV, size,    cudaMemcpyHostToDevice);    add4f<<<1,4>>>(devU, devV);    cudaMemcpy(hostU, devU, size,    cudaMemcpyDeviceToHost);    cudaFree(devV);    cudaFree(devU);    return 0;}//static__device__ float devU[4];__device__ float devV[4];__global__ addUV() {int i=threadIdx.x; devU[i]+=devV[i];}int main() {    float hostU[4] = {1, 2, 3, 4};    float hostV[4] = {1, 2, 3, 4};    size_t size = sizeof(float)*4;    cudaMemcpyToSymbol(devU, hostU, size, 0, cudaMemcpyHostToDevice);    cudaMemcpyToSymbol(devV, hostV, size, 0, cudaMemcpyHostToDevice);     addUV<<<1,4>>>();    cudaMemcpyFromSymbol(hostU, devU, size, 0, cudaMemcpyDeviceToHost);    return 0;}

   5、  常数存储器constant memory

   用于存储访问频繁的只读参数

   特点:只读;有缓存;空间小(64KB)

   注:定义常数存储器时,需要将其定义在所有函数之外,作用于整个文件 

1 __constant__ int devVar;2 cudaMemcpyToSymbol(devVar, hostVar, sizeof(int), 0, cudaMemcpyHostToDevice)3 cudaMemcpyFromSymbol(hostVar, devVar, sizeof(int), 0, cudaMemcpyDeviceToHost)

 6、  纹理存储器 texture memory

     是一种只读存储器,其中的数据以一维、二维或者三维数组的形式存储在显存中。在通用计算中,其适合实现图像处理和查找,对大量数据的随机访问和非对齐访问也有良好的加速效果。

     特点:具有纹理缓存,只读。

TNE END


           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值