CUDA коалесцирование и глобальная память - PullRequest
1 голос
/ 03 мая 2020

Мне сказали, что в моем курсе CUDA следующий доступ (глобальная память) коагулируется, если элементы моего массива "a" имеют размер 4,8 или 16 байтов.

int i = blockIdx.x*blockDim.x + threadIdx.x;
a[i];

2 условия для объединения: Потоки основы должны иметь доступ к фрагменту 32, 64 или 128 байтов. Первый поток деформации должен получить доступ к адресу, кратному 32, 64 или 128

Но в этом примере (первое условие) ничто не гарантирует, что деформация получит доступ к фрагменту из 32 байтов.

Если я предполагаю, что элементы a являются числами с плавающей запятой (4 байта), и если я определю blockDim.x как 5, то каждая деформация получит доступ к фрагментам по 20 (4x5) байтов, даже если элементы моего массива "a" имеют размер 4,8 или 16 байт, а не 32. Итак, самое первое утверждение о слиянии ложно?

Спасибо за ваш ответ.

1 Ответ

2 голосов
/ 03 мая 2020

Но в этом примере (первое условие) ничто не гарантирует, что деформация получит доступ к чанту из 32 байтов.

Из-за порядка потоков это гарантирует что каждая деформация имеет доступ к 128 байтам (32 потока по 4 байта). Что является необходимым условием доступа к объединенной памяти.

Если я предполагаю, что элементы a являются числами с плавающей запятой (4 байта), и если я определю blockDim.x как 5, то каждый деформированный фрагмент будет иметь доступ к фрагментам из 20 (4x5) байтов, хотя элементы моего массива "a" имеют размер 4,8 или 16 байтов, а не 32.

Деформации всегда представляют собой 32 потока. Если вы определите blockDim.x как 5, каждый блок будет состоять из 1 основы с 27 обнуляемыми потоками. Правила объединения будут по-прежнему применяться, и транзакции будут объединяться, но вы тратите 27/32 вашей потенциальной вычислительной мощности и пропускной способности памяти.

Итак, самое первое утверждение о объединении ложно?

...