为什么,在我的情况下,纹理内存比全局慢

时间:2012-03-27 15:51:28

标签: cuda textures

请帮帮我。我无法理解为什么这个函数,它使用纹理内存

__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 个答案:

答案 0 :(得分:2)

在Fermi上,全局内存加载缓存在L1中,L1缓存的带宽高于纹理缓存。

此外,您的2D空间局部性可能不够高,您可以从使用纹理中受益。如果是这样,您可以重构内核,以便同时运行的线程访问缓存中彼此更接近的值。

有关更多信息,请参阅此主题,以及进一步的指示:http://forums.nvidia.com/index.php?showtopic=181432