почему, в моем случае, текстурная память медленнее, чем глобальная - PullRequest
1 голос
/ 27 марта 2012

Пожалуйста, помогите мне. Я не могу понять, почему эта функция, которая использует текстурную память

__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 Ответ

2 голосов
/ 27 марта 2012

В Fermi глобальные загрузки памяти кэшируются в L1, а кэш L1 имеет более высокую пропускную способность, чем кэш текстур.

Кроме того, ваша пространственная локальность 2D может быть недостаточно высокой, чтобы вы могли извлечь выгоду из использования текстур.Если это так, вы можете провести рефакторинг своих ядер, чтобы параллельно работающие потоки обращались к значениям в кэше, которые ближе друг к другу.

См. Эту ветку для получения дополнительной информации и дополнительных указателей: http://forums.nvidia.com/index.php?showtopic=181432

...