请帮帮我。我无法理解为什么这个函数,它使用纹理内存
__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];
答案 0 :(得分:2)
在Fermi上,全局内存加载缓存在L1中,L1缓存的带宽高于纹理缓存。
此外,您的2D空间局部性可能不够高,您可以从使用纹理中受益。如果是这样,您可以重构内核,以便同时运行的线程访问缓存中彼此更接近的值。
有关更多信息,请参阅此主题,以及进一步的指示:http://forums.nvidia.com/index.php?showtopic=181432