Стоит ли разгружать вычисления FFT встроенным графическим процессором?

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

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

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

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

Проверьте эту статью, чтобы получить современное сравнение между FFTW (CPU) и CUDA FFT (GPU) размером до 2 ^ 16 FFT: https://arxiv.org/abs/1707.07263 Чжан - Параллельный метод, оптимизированный для памяти на основе графического процессора (2017)