2012-03-27 63 views
1

請幫幫我。我不明白爲什麼這個功能,使用紋理內存爲什麼在我的情況下,紋理內存比全局要慢

__global__ void corr (int * data) 
{ int idx = (blockIdx.y*blockDim.y+threadIdx.y)*64+ (blockIdx.x * blockDim.x + threadIdx.x); 
data[idx]=0; 
for(int i=0; i<blockDim.y-threadIdx.y; i++) 
for(int j=0; j<blockDim.x-threadIdx.x; j++) 
data [idx] = data[idx] + tex2D(g_TexRef,blockIdx.x * blockDim.x + threadIdx.x +j, blockIdx.y*blockDim.y+threadIdx.y+i); 

工作速度低於此功能的另一個版本,它使用全球內存

__global__ void corr1(int * in , int * data) 
{ int idx = (blockIdx.y*blockDim.y+threadIdx.y)*64+ (blockIdx.x * blockDim.x + threadIdx.x); 
data[idx]=0; 
for(int i=0; i<blockDim.y-threadIdx.y; i++) 
for(int j=0; j<blockDim.x-threadIdx.x; j++) 
data [idx] = data[idx] +in[(blockIdx.y*blockDim.y+threadIdx.y+i)*64+blockIdx.x * blockDim.x + threadIdx.x +j]; 
+1

其中計算能力與Google合作?你有沒有嘗試在探查器中運行以查看緩存命中和未命中? – 2012-03-27 16:37:38

回答

2

在費米,全球內存負載在L1緩存並且L1緩存具有比紋理緩存更高的帶寬。

此外,您的2D空間位置可能不夠高,您可以從使用紋理中受益。如果是這樣,您可能能夠重構內核,以便併發運行的線程訪問緩存中彼此更接近的值。

看到這個線程的詳細信息,並進一步指針:http://forums.nvidia.com/index.php?showtopic=181432

相關問題