Вчера Майк (ghostop14) отправил нам по электронной почте документ, который даёт обзор его экспериментов по переписыванию нескольких блоков GNU Radio с целью использования ускорения на GPU через OpenCL. Высококачественные дискретные графические GPU на ПК — очень мощные параллельные процессоры, которые могут существенно быстрее выполнять вычисления, чем процессор общего назначения (CPU). Но только алгоритмы, которые можно распараллелить, стоит запускать на GPU, и существует дополнительная задержка на передачу данных между CPU и GPU. Это означает, что не все алгоритмы будут работать быстрее на GPU. Ускорение на GPU может стать ключом к тому, чтобы очень широкополосные SDRs могли работать на ПК.
В экспериментах Майк обнаружил, что только некоторые блоки GNU Radio можно ускорить на GPU. Многие блоки работали медленнее на GPU из-за дополнительных задержек. В конце концов блоки, которые он тестировал и которые действительно показывали ускорение, или ускорение в смесь, были следующими:
- Log10
- Complex To Arg
- Complex To Mag/Phase
- Пользовательский помощник по отношению сигнал/шум (Signal To Noise Ratio Helper), который выполняет последовательность деление -> Log10 -> Abs
- Mag/Phase To Complex (OpenCL дал лучшие результаты только для блоков выше 8K на 1070, и 18K для 970 и 1000M)
- Источник сигнала (OpenCL превосходил CPU только для 1070 при блоках 8K и выше)
- Квадратурная демодуляция (OpenCL лучше работал только для блоков выше 10K)
Проект называется gr-clenabled, и открытый исходный код gr-clenabled доступен на GitHub. Документ, описывающий полноценное исследование реализации и производительности блоков GNU Radio с использованием GPU, можно найти здесь. Ниже приведён фрагмент из обзора Майка (если вам нужна дополнительная информация, мы предлагаем сначала прочитать обзор, а затем полный исследовательский документ):
Примерно 4 месяца назад я решил взяться за проект, который давно хотел существовать. Учитывая весь код, доступный для использования графических карт в обработке сигналов, почему не было множества блоков с ускорением на GPU для GNURadio? По-настоящему задействуя свою новую видеокарту (NVIDIA GTX 1070), не мог ли я пропускать 80 MSPS или выше через, если бы у меня было оборудование, способное это обеспечить? (Я знаю скорости шины USB 2.0, некоторые декодеры требуют аппаратного ускорения для скорости и т. д., но SDR-энтузиаст все равно может мечтать)
Моя идея казалась достаточно простой. Почему бы не разработать версии OpenCL самых распространённых блоков, используемых в цифровой обработке данных? Я могу не достичь своей пропускной цели, но уверен, что смогу действительно ускорить мои потоковые графы. И раз уж могу придумать всё, что угодно до того, как реально начать, почему бы не сделать это ещё более масштабируемым? Почему бы не иметь возможность полноценно использовать несколько графических карт в системе, назначая разные блоки на выполнение на разных картах?
Я знаю, это много вопросов, но звучит отлично, если бы такое существовало, верно? Но я не осознавал масштабы того, чем собираюсь открыть.
Моей первой задачей было изучение OpenCL и действительно углубление в глубины кода GNURadio.

Источник:
