Стоит ли переносить вычисления FFT на встроенный графический процессор? - PullRequest
10 голосов
/ 17 ноября 2011

Мы рассматриваем перенос приложения с выделенного чипа цифровой обработки сигналов для работы на обычном аппаратном обеспечении x86. Приложение выполняет много преобразований Фурье, и из кратких исследований выяснилось, что БПФ довольно хорошо подходят для вычислений на GPU, а не на CPU. Например, на этой странице есть несколько тестов с Core 2 Quad и GF 8800 GTX, которые показывают 10-кратное уменьшение времени вычислений при использовании графического процессора:

http://www.cv.nrao.edu/~pdemores/gpu/

Однако в нашем продукте ограничения по размеру ограничивают нас небольшими форм-факторами, такими как PC104 или Mini-ITX, и, следовательно, довольно ограниченными встроенными графическими процессорами.

Является ли выгрузка вычислений на GPU чем-то, что стоит делать только с мясистыми видеокартами на правильной шине PCIe, или даже встроенные графические процессоры могут повысить производительность?

Ответы [ 5 ]

11 голосов
/ 31 декабря 2011

Разработав подпрограммы FFT как на аппаратном обеспечении x86, так и на графических процессорах (до CUDA, 7800 GTX Hardware ), я обнаружил, что по моим собственным результатам при меньших размерах FFT (ниже 2 ^ 13) процессор Быстрее. Выше этих размеров графический процессор был быстрее. Например, БПФ размером 2 ^ 16 вычислялось в 2-4 раза быстрее на GPU, чем эквивалентное преобразование на CPU. См. Таблицу времен ниже (время в секундах, сравнение Pentium 4 с частотой 3 ГГц и 7800 GTX. Эта работа была проделана еще в 2005 году на столь старом оборудовании и, как я уже говорил, не CUDA. Более новые библиотеки могут показывать большие улучшения)

N       FFTw (s)    GPUFFT (s)  GPUFFT MFLOPS   GPUFFT Speedup
8       0           0.00006     3.352705        0.006881
16      0.000001    0.000065    7.882117        0.010217
32      0.000001    0.000075    17.10887        0.014695
64      0.000002    0.000085    36.080118       0.026744
128     0.000004    0.000093    76.724324       0.040122
256     0.000007    0.000107    153.739856      0.066754
512     0.000015    0.000115    320.200892      0.134614
1024    0.000034    0.000125    657.735381      0.270512
2048    0.000076    0.000156    1155.151507     0.484331
4096    0.000173    0.000215    1834.212989     0.804558
8192    0.000483    0.00032     2664.042421     1.510011
16384   0.001363    0.000605    3035.4551       2.255411
32768   0.003168    0.00114     3450.455808     2.780041
65536   0.008694    0.002464    3404.628083     3.528726
131072  0.015363    0.005027    3545.850483     3.05604
262144  0.033223    0.012513    3016.885246     2.655183
524288  0.072918    0.025879    3079.443664     2.817667
1048576 0.173043    0.076537    2192.056517     2.260904
2097152 0.331553    0.157427    2238.01491      2.106081
4194304 0.801544    0.430518    1715.573229     1.861814

Как подсказывают другие авторы, передача данных в / из графического процессора - это ваш удар. Меньшие БПФ могут выполняться на CPU, некоторые реализации / размеры полностью в кеше. Это делает процессор лучшим выбором для небольших БПФ (ниже ~ 1024 баллов). Если, с другой стороны, вам нужно выполнять большие объемы работы с данными с минимальным перемещением в / из графического процессора, то графический процессор будет опережать процессор.

Я бы предложил использовать FFTW, если вам нужна быстрая реализация FFT, или Intel Math Library, если вы хотите еще более быструю (коммерческую) реализацию. Для FFTW выполнение планов с использованием флага FFTW_Measure будет измерять и тестировать самую быструю подпрограмму FFT для вашего конкретного оборудования. Я подробно расскажу об этом в этом вопросе .

Для реализаций GPU вы не можете получить лучшее, чем то, которое предоставляет NVidia CUDA. Производительность графических процессоров значительно возросла с тех пор, как я провел свои эксперименты на 7800GTX, поэтому я бы посоветовал дать их SDK возможность удовлетворить ваши конкретные требования.

5 голосов
/ 17 ноября 2011

Вам необходимо сравнить стоимость перемещения данных в память графического процессора и из нее с любой выигрышем в скорости использования графического процессора.Хотя возможно несколько перекрывать ввод-вывод и вычисления, вы все равно можете страдать, если требования к пропускной способности ввода-вывода превышают пропускную способность вычислений.Если у вас есть какие-либо дополнительные вычисления, которые можно выполнить для данных FFT, пока они находятся в памяти GPU, это может помочь снизить стоимость ввода-вывода.

Также важно отметить, что FFT на основе GPU обычно дают толькохорошая производительность для данных с одинарной точностью.Кроме того, вам нужно сравнить с наилучшим возможным FFT на базе процессора, например, FFTW, созданным для одинарной точности и использующим SSE.

3 голосов
/ 08 января 2015

Я хотел бы добавить ваш вопрос конкретно о встроенных графических процессорах.

У них, как правило, очень мало шейдерных ядер, меньше регистров для ядра и более низкая пропускная способность памяти по сравнению с высокопроизводительными графическими процессорами, которые можно увидеть на настольных ПК. Однако запуск приложений, подобных FFT, на встроенном графическом процессоре может дать лучшую производительность по сравнению с встроенным многоядерным процессором [1]. Основным преимуществом встроенных графических процессоров является то, что они совместно используют общую память с процессором, что позволяет избежать процесса копирования памяти с хоста на устройство.

Почти все встроенные графические процессоры, такие как Mali от ARM, adreno от Qualcomm и т. Д., Поддерживают OpenCL, поэтому использование библиотеки OpenCL для вашего FFT на встроенном графическом процессоре может дать лучшую производительность (clFFT от AMD хорошо известен и имеет открытый исходный код). Настройка кода OpenCL для архитектуры встроенного графического процессора может сделать его лучше (см. ARM Mali-T600 Series GPU OpenCL) Руководство разработчика на http://infocenter.arm.com)

[1] Ариан Магхазех, Унмеш, Бордолой Петру, Элес Пенг. генеральный Назначение вычислений на встраиваемых графических процессорах с низким энергопотреблением Достиг совершеннолетия?

2 голосов
/ 17 ноября 2011

8800 имеет порядка 100 ядер, работающих на частоте около половины ГГц.Я не думаю, что какие-либо из существующих встроенных графических процессоров для малых форм-факторов имеют столько же шейдерных / вычислительных ядер.

1 голос
/ 18 ноября 2011

Одной из проблем может быть получение технической информации, необходимой для загрузки и выполнения кода на графическом процессоре, а также для обмена данными и обмена с процессором. Nvidia предоставляет API под названием CUDA специально для этой цели. Так что выбирайте плату с графическим процессором Nvidia, которая поддерживает CUDA, и вы, вероятно, сможете экспериментировать и тестировать тесты при очень небольших затратах и ​​даже создавать прототипы на обычном настольном ПК.

Что касается аппаратного обеспечения малого форм-фактора, это обсуждение может быть актуальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...