Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Производительность современных GPU при вычислении FFT
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
rloc
Коллеги, подскажите, какой максимальной производительности можно достичь на современных GPU при вычислении FFT 64К комплексных точек, 24 бит, radix-4 или более, с одинарной и двойной точностью? Среда разработки не имеет значения, нужно понять потолок производительности, с учетом полосы памяти. Если GPU умеет вычислять в потоке (streaming), то интересует минимальное время между загрузкой новых данных и выгрузкой обработанных.
Serg76
Занимался подобной проблемой, результат неутешительный. Непосредственно сам расчет FFT на GPU выполняется очень быстро по сравнению с CPU (выигрыш может составлять сотни раз), но главной проблемой, таким себе «бутылочным горлышком» остается обмен данными между хостом и девайсом, который «жрет» 99% времени, особенно это касается передачи данных с девайса на хост, это процедура намного медленнее, чем загрузка данных на GPU. Если данные не забирать после расчета, то смысл в этом есть, а так все печально, конечно. Карточка, с которой игрался - бюджетный GeForce GTX750ti/128 bit/1 Gb GDDR5
krux
длинные поточные FFT удобно делать на ПЛИСах.
под них заточен алгоритм Cooley-Tukey. вполне можно в реалтайме обрабатывать 64Msps 16bit размером в 32M точек в целочисленке.
rloc
Цитата(Serg76 @ Apr 5 2018, 09:27) *
главной проблемой, таким себе «бутылочным горлышком» остается обмен данными между хостом и девайсом

Вы можете сказать, чем определяется производительность обмена данными?

Перейду к конкретике. Допустим, есть 2 квадратурных канала сбора данных по 16 бит, частота 100 МГц (в перспективе больше, до 500 МГц и выше). Квадратурные каналы - аналоговые, нужно предварительно подкорректировать смещение нуля, фазы и амплитуды. Потом - FFT с заданным количеством точек (для конкретики - 64К), матобработка между каналами, накопление. На выходе - поток не большой, возможно в разы меньше входного. Насколько легко современные GPU способны "переваривать" такие задачи? В первую очередь конечно интересует скорость FFT, в идеале - с 50% перекрытием, в худшем случае - с минимальными разрывами в обработке.

Цитата(krux @ Apr 5 2018, 09:40) *
длинные поточные FFT удобно делать на ПЛИСах.

Да, в части FPGA мне все более-менее понятно, по гибкости и ширине полосы памяти (внутренней) возможностей значительно больше.
_pv
ещё новые шарки SC58x у AD c FFT ускорителями обещают ~5нс на отсчёт, (1к ФФТ за 5 мкс)
то есть 100МГц с 50% перекрытием пережевать вроде должны.
rloc
На DSP закладываться опасно, основная проблема - в гибкости проектирования. Скажем, захочу перейти на radix-16, radix-32 ... Что делать в этом случае? Не позволяет DSP разменивать память на вычислительные ресурсы. С GPU чувствую такая же проблема будет.
Serg76
Цитата(rloc @ Apr 5 2018, 10:00) *
Перейду к конкретике. Допустим, есть 2 квадратурных канала сбора данных по 16 бит, частота 100 МГц (в перспективе больше, до 500 МГц и выше). Квадратурные каналы - аналоговые, нужно предварительно подкорректировать смещение нуля, фазы и амплитуды. Потом - FFT с заданным количеством точек (для конкретики - 64К), матобработка между каналами, накопление. На выходе - поток не большой, возможно в разы меньше входного. Насколько легко современные GPU способны "переваривать" такие задачи? В первую очередь конечно интересует скорость FFT, в идеале - с 50% перекрытием, в худшем случае - с минимальными разрывами в обработке.

Прогнал тест, при таких нач.условиях ( i/q 16 bit, FFT Size = 64K) получилась скорость входного потока порядка 3 Gbit/s, т.е. практически Ваши 100 МГц. если взять более топовую карту, то думаю будет по-веселее
_pv
за/против GPU ещё наверное зависит от того есть ли эти 3, а в перспективе до 15 Гбит/с уже в ПК или их ещё туда засунуть надо?
rloc
В моем случае данных в хосте изначально нет, сначала плата оцифровки должна передать их по шине PCIe, и возможно, если она умеет быть мастером, то напрямую в GPU. Вопрос, что является узким звеном в этом обмене?

Цитата(_pv @ Apr 5 2018, 16:09) *
в перспективе до 15 Гбит/с

Откуда берется эта цифра?
_pv
2 квадратурных канала сбора данных по 16 бит, частота 100 МГц (в перспективе больше, до 500 МГц и выше)
2*16*100 = 3.2ГБит/с
2*16*500 = 16ГБит/с
RobFPGA
Приветствую!

Цитата(_pv @ Apr 5 2018, 16:44) *
2 квадратурных канала сбора данных по 16 бит, частота 100 МГц (в перспективе больше, до 500 МГц и выше)
2*16*100 = 3.2ГБит/с
2*16*500 = 16ГБит/с

Если Вам надо закапчить пару гигабайт данных и потом пережевывать FFT и считать хитрую математику то можно попыхтеть и на GPU. Если же надо работать непрерывно с потоком то лучше потратить время с FPGA - лет 7-10 назад делал похоже на 4 Virtex - 2 канала 16 бит/250MHz, 16K FFT с перекрытием 50%, с кросс-кореляцией и с накоплением. Сейчас такое можно собрать на готовом модуле с Artix/Kintex/Zynq от $300 будет заодно и интерфейс к ADC и выдача результата через Ethernet.

Успехов! Rob.
rloc
Цитата(_pv @ Apr 5 2018, 16:44) *
2*16*500 = 16ГБит/с

Решил, что ограничение в 3 Гбит/c (в конкретном примере) было больше связано с интерфейсом, по первым ответам.

По моим расчетам, узким местом в GPU может быть ограниченная полоса памяти и возможность ее эффективного использования в случае рандомного доступа. Насколько эффективно компиляторы могут оптимизировать алгоритм - для меня темный лес, что и хотелось выяснить, с экстраполяцией результатов на Pascal GP100/Radeon RX Vega с памятью HBM2 2048 бит.

Цитата(RobFPGA @ Apr 5 2018, 17:29) *
делал похоже на 4 Virtex - 2 канала 16 бит/250MHz, 16K FFT с перекрытием 50%, с кросс-кореляцией и с накоплением.

С удовольствием посмотрел бы на рабочий образец в действии ) Продолжение было?
RobFPGA
Приветствую!

Цитата(rloc @ Apr 5 2018, 20:21) *
Решил, что ограничение в 3 Гбит/c (в конкретном примере) было больше связано с интерфейсом, по первым ответам.
...
С удовольствием посмотрел бы на рабочий образец в действии ) Продолжение было?

А че на него смотреть - сначала был PCIX модуль на базе Virtex4SX35 от Московской ISYS.
Потом сделали свой на базе модуля на Spartan6 и Artix7. Причем FFT обработка была на Spartan6!
а Artix7 использовался для интерфейсов 1G Ethernet и либо PCIe x4 либо Ethernet 10G.

Ну а продолжение потом было на Virtex5 - в realtime считался поток 6.6 GByte/s (12 бит/2.2GHz), правда FFT всего 512 точек но зато обработка каждого спектра геморройная.
Ну а на сегодняшнем железе ( UltaScale, UltaScale+ ... ) такие чудеса можно наворотить....

Успехов! Rob.


rloc
Цитата(RobFPGA @ Apr 5 2018, 21:20) *
Московской ISYS.

БукоФФки не хватает. Знаком с компанией ни один десяток лет. Как раз недавно ведущий разработчик делал доклад в тему:

https://www.youtube.com/watch?v=pmLUZ8hFoa0
stealth-coder
GPU предусматривают 2 режима обмена данными - синхронный и асинхронный. Скорость копирования в асинхронном режиме ограничивается только скоростью памяти хоста и карточки и скоростью PCIe, со скоростью 15 Гбит/с на мощном железе не должно возникнуть проблем, такую скорость дает PCIe Gen 2 x4, для DDR 1600 МГц/64 бита это вообще ни о чем. В задаче ТС больше вопросов может возникнуть к карточке, скорость вычислений сильно зависит, например, от разрядности шины. Вообще информация по FLOP для разных карточек есть в интернете, для БПФ сделать оценку требуемой производительности не составляет труда.
rloc
Цитата(stealth-coder @ Apr 6 2018, 18:18) *
для БПФ сделать оценку требуемой производительности не составляет труда.

Так нужны не расчеты, а примеры реализации с конкретными цифрами, с оптимизированным кодом под определенную задачу. Зачем GPU тестируют на каждой игре отдельно?
Serg76
Цитата(stealth-coder @ Apr 6 2018, 18:18) *
Скорость копирования в асинхронном режиме ограничивается только скоростью памяти хоста и карточки и скоростью PCIe, со скоростью 15 Гбит/с на мощном железе не должно возникнуть проблем, такую скорость дает PCIe Gen 2 x4, для DDR 1600 МГц/64 бита это вообще ни о чем.

Сначала я тоже так думал, но практика, а также профайлеры показали, что проблема именно в копировании между устройствами.
stealth-coder
Цитата(rloc @ Apr 6 2018, 18:54) *
Так нужны не расчеты.

Любая инженерно-техническая задача начинается с расчета (оценки), исходя из расчета выбираются пути реализации. Если вам подходит стандартный БПФ, то он есть в примерах CUDA, можете скачать, поставить, запустить и посмотреть на цифры.


Цитата(Serg76 @ Apr 6 2018, 22:07) *
Сначала я тоже так думал, но практика, а также профайлеры показали, что проблема именно в копировании между устройствами.

В вашем конкретном случае может это и так, не зная подробностей задачи и железа и не посмотрев в код ничего внятного сказать нельзя. Но меня жизнь научила, что в 90% случаев "дело не в бобине". Раз производители делают PCIe на много линий, значит железо в состоянии их утилизировать, т.е. для современной видеокарты скорости обмена в десятки гигабит в секунду - нормальный режим работы.
Serg76
Цитата(stealth-coder @ Apr 7 2018, 11:15) *
В вашем конкретном случае может это и так, не зная подробностей задачи и железа и не посмотрев в код ничего внятного сказать нельзя. Но меня жизнь научила, что в 90% случаев "дело не в бобине". Раз производители делают PCIe на много линий, значит железо в состоянии их утилизировать, т.е. для современной видеокарты скорости обмена в десятки гигабит в секунду - нормальный режим работы.

В этом тесте ничего сложного нет, 3 строчки кода: копирование на карту, FFT и копирование с карты на хост, все библиотечные оптимизированные функции, хотя свой код FFT тоже пробовал. В результате получам 2,5 Гбит/с на том железе, что у меня есть. если убрать копирование с карты на хост, то получаем 3 Гбит/с,т.е. 15 % ресурсов «жрет» тривиальная функция копирования!!! Не много ли?
faa
Вот тут английский самоделкин на GPU от Raspberry Pi БПФ-ит.
Можно прикинуть производительность для "толстых" GPU.
Разбивает на мелкие с доворотом между ними.
Мы таким способом делали в ПЛИС БПФ на 16М. 8 реальных каналов на XC6V240, 4 потока, разбор.
Частота семплирования 80МГц, на выходе 8 комплексных спектров в 8М бинов по ~5Гц с перекрытием 50%.
Сейчас на Kintex Ultrascale 16 реальных каналов (семплирование ~118МГц) получилось на 4М бинов по ~7Гц с перекрытием 25%.
На GPU в потоке не получилось - думали-смотрели, но не влезло (а может не осилили). Пришлось плисоводить sm.gif.
thermit
Странные показатели у вас.

gtx1060 complex fft 64k

dp ~573 us
из них
21% выполнение
43% копирование туда
37% копирование обратно

sp ~297 us
из них
7% выполнение
55% копирование туда
38% копирование обратно

Собственно, дуплексная пропускная способность шины составляет ~15 - 18гбит/с

зы
т stealth-coder прав на 110%. Сначала оценка, потом выбор пути решения. Иначе получим изучение проблем шаманизма на начальном этапе разработки и проблем опорно-двигательного аппарата на последующих. Оно вам надо? Ну и pci-e 16x - это неспроста, как говорил в. пух.




blackfin
Цитата(thermit @ Apr 7 2018, 16:04) *
Странные показатели у вас.

gtx1060 complex fft 64k

dp ~573 us

Выходит, gtx1060 при входном потоке 500 MHz сделать complex fft 64k не успевает?

Время заполнения буфера семплами с выхода АЦП: 64к*2ns = 128 us.

Соответственно, если считать FFT с перекрытием 50%, то время вычисления FFT должно быть меньше 64 us.

А в реале получается, что время вычисления FFT на GPU с учетом загрузки и выгрузки данных в разы больше времени заполнения буфера семплами с выхода АЦП.
thermit
Очевидно, что не успевает.
Честно говоря, обработать полосу в 500мгц - нетривиальная задача, требующая индивидуального подхода. Универсальные решения тут не годятся.
rloc
Цитата(faa @ Apr 7 2018, 16:00) *
На GPU в потоке не получилось - думали-смотрели, но не влезло (а может не осилили). Пришлось плисоводить sm.gif.

Подсознательно кажется с GPU больше "подводных камней" и на начальном этапе они могут быть не видны. Нет прозрачности в пути ADC->PCIe->GPU->PCIe->Host.

Цитата(faa @ Apr 7 2018, 16:00) *
Сейчас на Kintex Ultrascale 16 реальных каналов (семплирование ~118МГц) получилось на 4М бинов по ~7Гц с перекрытием 25%.

Пробежимся по структуре? RobFPGA, подключайтесь. Набросал по-быстрому схему, могу ошибаться, поправляйте:

Нажмите для просмотра прикрепленного файла

Подумал, действительно, закладываться на один "жирный" FPGA смысла не имеет. В модульной структуре легче обеспечить большую ширину памяти, ПО модулей может быть одинаковым, соответственно меньше времени на компиляцию и верификацию, выше частота работы. Последовательная структура мне показалась более удобной с точки зрения передачи данных (pipeline). Есть два вопроса:

1. Ширина полосы памяти на один модуль.
По самым оптимистичным оценкам достаточно обеспечить тройную (запись, чтение, коэффициенты) ширину входной полосы с ADC, приведенную к ширине внутренней арифметики.

2. Перектрытие.
За счет чего обеспечить? За счет увеличения кол-ва модулей или гарантии более высокой скорости обработки?
faa
Цитата(rloc @ Apr 7 2018, 19:44) *
Есть два вопроса:

1. Ширина полосы памяти на один модуль.
По самым оптимистичным оценкам достаточно обеспечить тройную (запись, чтение, коэффициенты) ширину входной полосы с ADC, приведенную к ширине внутренней арифметики.

2. Перектрытие.
За счет чего обеспечить? За счет увеличения кол-ва модулей или гарантии более высокой скорости обработки?


16 каналов, 4 АЦП по 4 канала, квадратуры в цифре с децимацией на 4 (на 3 не пролезли по памяти).
ПЛИС одна.
Память: 4 контроллера DDR3-1600 - 32х, 64х, 64х, 32х; HMC - полтора линка (х8 - слева, х16 - справа ПЛИС).
Наружу: PCIe Gen3 ext x8, PCIe Gen3 ext x4, HMC - два линка х16, serdes - два линка х4 (один слева, другой справа ПЛИС).

Как-то так.

Контроллеры DDR3 - физика из MIG, логика своя. За 6,5 мкс пишет/читает 256 отсчетов по всем каналам, регенерация, калибровка VT.
Перекрытие 25%, в первый буфер пишем 192 отсчета, читаем 256.

Из шишек: замирание PCIe, при пиковой (расчетной) для Gen3 x8 более 6ГБ/сек (даже при TLP128) для 4.8ГБ/сек имели некоторые неудобства.
Пришлось городить эластик-буфер и резать лишнее wink.gif.

Скорость DDR3 можно поднять (ПЛИС позволяет), тогда проходит и децимация на 3,5.

ЗЫ: На общие вопросы могу здесь ответить, подробности - лучше в личку.
RobFPGA
Приветствую!
Цитата(rloc @ Apr 7 2018, 19:44) *
Подсознательно кажется с GPU больше "подводных камней" и на начальном этапе они могут быть не видны.
Нет прозрачности в пути ADC->PCIe->GPU->PCIe->Host.
Вот вот ...
Цитата(rloc @ Apr 7 2018, 19:44) *
Пробежимся по структуре? RobFPGA, подключайтесь. Набросал по-быстрому схему, могу ошибаться, поправляйте:
Нее - я предпочитаю медленно спустится с горы и ... wink.gif

Цитата(rloc @ Apr 7 2018, 19:44) *
Подумал, действительно, закладываться на один "жирный" FPGA смысла не имеет. В модульной структуре легче обеспечить большую ширину памяти, ПО модулей может быть одинаковым, соответственно меньше времени на компиляцию и верификацию, выше частота работы. Последовательная структура мне показалась более удобной с точки зрения передачи данных (pipeline). Есть два вопроса:
Еще не знаем что делать но будем делать универсально и модульно wacko.gif !

Цитата(rloc @ Apr 7 2018, 19:44) *
1. Ширина полосы памяти на один модуль.
По самым оптимистичным оценкам достаточно обеспечить тройную (запись, чтение, коэффициенты) ширину входной полосы с ADC, приведенную к ширине внутренней арифметики.

2. Перектрытие.
За счет чего обеспечить? За счет увеличения кол-ва модулей или гарантии более высокой скорости обработки?

Смотрим что есть на входе FFT=64K, I,Q=16 6ит, для таких N коэффициенты нужны не меньше 20 бит.
Начинаем кумекать как можно это считать - например смотрим структуру FFT R22.
Если не забыл то для N точек нужно N слов (I,Q) памяти для данных и N/4 слов коэффициентов.
Грубо - надо 64K * 4 * 1.5 + 16K * 5 = 384 + 80 KByte, + 64 KByte + таблица для окна. ~ 528 KByte.
Влезет даже в средний чип. Если нужно перекрытие %50 + еще 256K на входной буфер.
Если немного по оптимизировать то часть памяти для коэффициентов и таблицу окна можно сэкономить считая на логике все на лету. Самые большие (входных и для первых stage) можно и во внешнюю память вынести (если полосы хватить).

Структура FFT R22 считает семпл за такт - на заморачиваясь можно получить 300 MHz - если "котика выжать" можно получить еще 5 капе.. и 400 MHz тактовой.

Ну а дальше как игра в наперстки - как крутить вертеть данными либо по очереди в один FFT - если успеваем по частоте.
Либо распределяем на несколько FFT по очереди, либо и то и другое.

Вот когда для конкретной системы будут такие квадратики структуры с цифрами ресурсов и со стрелочками описывающими основные потоки данных - тогда можно будет выбирать "тощий" чип и строить универсальный конвейер.

Ах да - а что с данными после FFT делать не забудьте прикинуть и посчитать. Там ведь тоже будет сюрпризов.

Удачи! Rob.
rloc
Цитата(RobFPGA @ Apr 7 2018, 23:20) *
будем делать универсально и модульно

Да, раз есть готовое и вкусное.

Цитата(RobFPGA @ Apr 7 2018, 23:20) *
смотрим структуру FFT R22.

Спасибо, посмотрим. Насколько сложно в алгоритме сделать переменную длину?

Цитата(RobFPGA @ Apr 7 2018, 23:20) *
Структура FFT R22 считает семпл за такт

Выравнивающие задержки есть? Какой длины? Зависят от длины преобразования?

Цитата(faa @ Apr 7 2018, 20:57) *
ПЛИС одна.
Память: 4 контроллера DDR3-1600 - 32х, 64х, 64х, 32х; HMC - полтора линка (х8 - слева, х16 - справа ПЛИС).
Наружу: PCIe Gen3 ext x8, PCIe Gen3 ext x4, HMC - два линка х16, serdes - два линка х4 (один слева, другой справа ПЛИС).

Очень тяжелый проект, и физически и морально.
RobFPGA
Приветствую!

Цитата(rloc @ Apr 8 2018, 01:45) *
Да, раз есть готовое и вкусное.
Вкусы у все разные - бывает такое иногда подадут ... cranky.gif

Цитата(rloc @ Apr 8 2018, 01:45) *
Спасибо, посмотрим. Насколько сложно в алгоритме сделать переменную длину?
В алгоритме то? - да запросто wink.gif А вот в реальности не всегда.

Цитата(rloc @ Apr 8 2018, 01:45) *
Выравнивающие задержки есть? Какой длины? Зависят от длины преобразования?
Ээээ ... телепатическая манна закончилась - Вы это о чем?

Цитата(rloc @ Apr 8 2018, 01:45) *
Очень тяжелый проект, и физически и морально.
Тяжесть выбора - груз ответственности sad.gif - мужайтесь! - щас мы Вам насоветуем ... sm.gif

Удачи! Rob.
blackfin
Цитата(rloc @ Apr 7 2018, 19:44) *
Подумал, действительно, закладываться на один "жирный" FPGA смысла не имеет.

У всех своё представление о том, что есть "жирный" FPGA.. wink.gif

Pipeline FFT Radix-4 на 64k комплексных точек влазит в XC7K410T и ещё остается ~30% свободной BRAM памяти.
rloc
Цитата(blackfin @ Apr 8 2018, 07:52) *
Pipeline FFT Radix-4 на 64k комплексных точек влазит в XC7K410T

Ближе к этапу проектирования станет понятно, как проще и дешевле. 64К и 500МГц - это не конечная цель, можно и больше, важнее иметь масштабируемую структуру, чтобы начать с простого преобразования на 1К и дальше развить до 16M (как пример). На текущий момент необходимо понять, что лучше подходит для потоковой обработки:

1. Можно ли сэкономить на промежуточном хранении данных, чтобы остаться в рамках 1К-16М внутри одного кристалла? Разумная ширина внешней памяти допускается. Понятие разумности определяется количеством выводов BGA. Мне кажется, нужно ограничить размерность FPGA количеством выводов не более 900. Если выше - существенно растет время компиляции и верификации, да и разработка самой платы может оказаться не простой задачей, тогда лучше перейти ко второму варианту.

2. Сократить сроки разработки и отладки за счет некоторой избыточности железа по объему и производительности, но применению простых унифицированных модулей и простых алгоритмов обработки, пусть с большим количеством операций сложения и умножения. Возможно это и есть золотая середина между GPU и FPGA.
faa
Цитата(rloc @ Apr 8 2018, 01:45) *
Очень тяжелый проект, и физически и морально.


bb-offtopic.gif Ваши слова да начальству бы в уши sm.gif

По делу:
поищите статейку "FPGA implementation of a 32k accumulating FFT with 2-Gs/s throughput".
Она от 2005 года, но, ИМХО, актуальна. Там на V2Pro и V4.
А сейчас ПЛИС намного "веселее", есть где развернуться wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.