生活随笔
收集整理的這篇文章主要介紹了
CUDA内存类型memory
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
CUDA內(nèi)存類型memory
2013-09-30 10:34 4224人閱讀 收藏 舉報
分類: CUDA(106)
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中。
特點(diǎn):每個線程私有,速度快。
2、? 局部存儲器 local memory
當(dāng)register耗盡時,數(shù)據(jù)將被存儲到local memory。如果每個線程中使用了過多的寄存器,或聲明了大型結(jié)構(gòu)體或數(shù)組,或編譯器無法確定數(shù)組大小,線程的私有數(shù)據(jù)就會被分配到local memory中。
特點(diǎn):每個線程私有;沒有緩存,慢。
注:在聲明局部變量時,盡量使變量可以分配到register。如:
unsigned int mt[3];
改為: unsigned int mt0, mt1, mt2;
3、? 共享存儲器 shared memory
可以被同一block中的所有線程讀寫
特點(diǎn):block中的線程共有;訪問共享存儲器幾乎與register一樣快.
[cpp] view plaincopy
????__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;??}??????extern?__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
特點(diǎn):所有線程都可以訪問;沒有緩存
[cpp] view plaincopy
??__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;??}??????__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、? 常數(shù)存儲器constant memory
? 用于存儲訪問頻繁的只讀參數(shù)
? 特點(diǎn):只讀;有緩存;空間小(64KB)
注:定義常數(shù)存儲器時,需要將其定義在所有函數(shù)之外,作用于整個文件?
1 __constant__
int devVar;
2 cudaMemcpyToSymbol(devVar, hostVar,
sizeof(
int),
0, cudaMemcpyHostToDevice)
3 cudaMemcpyFromSymbol(hostVar, devVar,
sizeof(
int),
0, cudaMemcpyDeviceToHost)
?6、? 紋理存儲器 texture memory
? ? ?是一種只讀存儲器,其中的數(shù)據(jù)以一維、二維或者三維數(shù)組的形式存儲在顯存中。在通用計算中,其適合實(shí)現(xiàn)圖像處理和查找,對大量數(shù)據(jù)的隨機(jī)訪問和非對齊訪問也有良好的加速效果。
? ? ?特點(diǎn):具有紋理緩存,只讀。
TNE END
總結(jié)
以上是生活随笔為你收集整理的CUDA内存类型memory的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。