Следующим этапом исследований явилось определение реального повышения производительности
GPU (автор использовал карту на основе процессора GTX 560 Ti) по сравнению с GPU (у автора
- 4-х ядерный процессор Intel Core i5-2320 Sandy Bridge 3,0 GHz
с кэшем уровня L1 размером 32 kB для данных + 32 kB для инструкций на каждое ядро,
кэшем L2 256 kB для каждого ядра и кэшем L3 6 МB и оперативная память 8 GB; операционная
среда - Windows Home Basic 7 SP1 64-bit, компилятор MS Visual Studio 2005).
Исследования производились
на процедуре перемножения матриц (блоками 16×16 элементов матриц)
согласно книге [I]; результаты эксперимента приведены на рис.
справа. Порядок квадратных перемножаемых матриц устанавливался равным 512, 1024, 2048, 3072 и 4096 для
действительных чисел форматов float и double; при этом за время выполнения операции на
GPU принималось не только время собственно умножения, но учитывались и время загру́зки
данных на GPU и время обратной вы́грузки. Для замера времени применялась C-функция ftime()
вместо специфического для CUDA метода, основанного на событиях (CUDA events).
Такой подход оправда́н в том случае, когда результат операции на GPU является конечной целью вычислительного процесса
(и неприе́млем, конечно, для варианта дальнейшй обработки на GPU).
Для CPU была распи́сана стандартная классическая схема (гнездо циклов уровня 3) умножения матриц;
при этом возможности SSE
(Streaming SIMD Extensions)
не использовались.
Ускорение (убыстре́ние) процесса вычислений определялось простым отношением времени
выполнения операции умножения на CPU и GPU; данные для чисел различного формата и порядка перемножаемых
матриц приведены слева. Видно, что ускорение вычислений может достигать многосоткратной величины
(при использовании SSE на CPU - меньше, конечно) и мало зависит от типа
(float или double) данных
(согласно [I] арифметические операции всегда выполняются над
данными типа double); снижение интенсивности роста
ускорения по мере увеличения порядка матриц связано, по-видимому, с возрастанием доли времени на
обмен данными между CPU и GPU.
Утилита CUDA-Z
для этой карты показывает производительность для double в 105 Glop/s,
а для float - 839 Glop/s. Значит, при использовании специфических для
float функций __fadd_ и
__fmul_ следует ожидать ещё большего роста производительности GPU.
Т.о. автор на опыте убедился в существенном убыстре́нии вычислений при использовании
GPU и технологии CUDA и намерен применять их в собственных разработках программного
обеспечения.
В качестве литературных источников по развертыванию и использованию технологии CUDA
можно рекомендовать:
-
Боресков А.В., Харламов А.А. Основы работы с технологией CUDA (+ CD). —M.:
ДМК Пресс, 2011. -232 c. (выгрузить;
убрано по требованию Агентства авторской безопасности).
-
Сандерс Дж., Кэндрот Э. Технология CUDA в примерах: введение в программирование графических процессоров (пер. c англ.). —M.: ДМК Пресс, 2011. -232 c.
C иными книгами Борескова А.В. также полезно ознакомиться..