CUDA_full / L03_Threads_Memory
.pdfВариант 5
При s <= 32 в блоке работает только один варп.
Можно развернуть цикл, избавившись от синхронизации и проверки условия.
for ( int s = blockDim.x / 2; s > 32; s >>= 1 ) { if ( tid < s )
data [tid] += data [tid + s]; __syncthreads ();
}
if ( tid < 32 ) data [tid] += data [tid] += data [tid] += data [tid] += data [tid] += data [tid] +=
}
{ // unroll last iterations data [tid + 32];
data [tid + 16]; data [tid + 8]; data [tid + 4]; data [tid + 2]; data [tid + 1];
Н. Новгород, 2012 г. |
Исполнение потоков. Иерархия памяти |
61 |
|
|
Результаты
Вариант алгоритма |
Время выполнения |
|
(миллисекунды) |
|
|
1 |
19.09 |
|
|
2 |
11.91 |
|
|
3 |
10.62 |
|
|
4 |
9.10 |
|
|
5 |
8.67 |
|
|
Возможна дальнейшая оптимизация: полное разворачивание на этапе компиляции при помощи параметров шаблонов. В примере в SDK данный вариант
реализован.
Н. Новгород, 2012 г. |
Исполнение потоков. Иерархия памяти |
62 |
|
|
Материалы
Линев А.В., Боголепов Д.К., Бастраков С.И. «Технологии параллельного программирования для процессоров новых архитектур» / Учебник.
Дополнительная подготовка магистров по программе «Суперкомпьютерные технологии»: http://hpcc.unn.ru/?doc=493
NVIDIA CUDA C Programming Guide v. 4.1.
А.В. Боресков, А.А. Харламов «Основы работы с технологией CUDA» и материалы курса по CUDA в МГУ: https://sites.google.com/site/cudacsmsusu/file-cabinet
Д. Сандерс, Э. Кэндрот «Технология CUDA в примерах: введение в программирование графических процессоров»
(пер. с англ.).
Н. Новгород, 2012 г. |
Исполнение потоков. Иерархия памяти |
63 |
|
|