ВОПРОСЫ СОЗДАНИЯ И ФУНКЦИОНИРОВАНИЯ ПЕРСПЕКТИВНЫХ ТЕХНОЛОГИЙ ПОДВИЖНОЙ РАДИОСВЯЗИ
ОПТИМИЗАЦИЯ АССЕМБЛЕРНОГО КОДА С SSE КОМАНДАМИ ДЛЯ ПРОГРАММ ЦИФРОВОЙ ОБРАБОТКИ СИГНАЛОВ В РЕАЛЬНОМ ВРЕМЕНИ
Р.С. Аверьянов, директор по производственной деятельности ООО «НСТТ», roman3178823@gmail. com;
А.О. Шорин, технический директор ООО «НСТТ», as@nirit.org УДК 621.391
Аннотация. Рассматривается метод увеличения производительности ассемблерных программ, работающих на базе платформы Intel, и использующих SSE команды параллельного вычисления. Указываются скрытые вычислительные резервы, содержащиеся на субкомпиляционном уровне. Приведены экспериментальные данные по расчету вычислительных затрат для базовых команд SSE.
Ключевые слова: вычислительные затраты; ассемблер; платформа intel; SSE команды;
БПФ.
OPTIMIZATION OF THE ASSEMBLER CODE WITH SSE COMMANDS USED FOR PROGRAMS FOR DIGITAL SIGNAL PROCESSING IN REAL TIME
Roman Averyanov, Production Director of LLC "NXTT"; Alexander Shorin, technical director of LLC "NXTT"
Annotation. The method of increasing the performance of assembler programs running on the basis of Intel platform and using SSE parallel calculation commands is considered The latent computational reserves contained at the subcompilation level are indicated Experimental data on calculation of computational costs for basic SSE commands are given.
_Keywords: computing cost; assembler; intel platform; SSE commands; FFT._
Введение
На современном этапе развития техники средств связи повсеместно утвердилась цифровая обработка сигналов, позволяющая в значительной степени повысить показатели качества связи [1-5], а также существенно улучшить показатели электромагнитной совместимости [6-10]. Кроме того, цифровые методы обработки открывают новые способы организации связи, позволяющие в реальном времени производить настройки рабочих параметров под текущее состояние радиолинии [11-12] и управлять диаграммами направленности антенн базовых станций [13-15]. С внедрением цифровых методов обработки в системах мобильной связи и сетях Wi-Fi широко распространилось использование сигналов OFDM, предполагающих применение техники быстрого преобразования Фурье (БПФ) в режиме формирования и демодуляции сигналов. Указанные обстоятельства сделали актуальными задачи повышения производительности и эффективности программ реального времени, используемых для обработки и формирования сигналов. Современный персональный компьютер (ПК) выступает как мощное средство цифровой обработки, позволяющее решать подобные задачи, отрабатывать алгоритмы и даже использоваться в практических приложениях, когда не требуется миниатюризация и автономность функционирования. Но для современных систем связи характерна высокая информационная скорость обмена, что порождает требование высокой производительности для программ обработки. Поэтому задачи
составления программных кодов повышенной производительности приобретают особую важность.
Скрытые резервы для повышения производительности программ ПК
Производительность математических сопроцессоров у обычных ПК на современном этапе развития достаточно велика (порядка нескольких G Flops). Это открывает возможности создания программ цифровой обработки реального времени для высокоскоростных процессов без применения специального оборудования. Но для этого требуется более тщательная проработка вопросов организации алгоритмов на низком уровне и привлечение техники программирования на языке Assembler с учетом возможностей распараллеливания процессов.
Технология производства чипов вышла на определенный рубеж, на котором дальнейшее увеличение производительности ограничивается физическими принципами, лежащими в основе методов конструирования. Поэтому сколь-нибудь заметное повышение тактовой частоты обычных ПК в обозримом будущем не ожидается. В таких условиях на первый план выступает анализ существующих возможностей и поиск рациональных методов программирования. Забегая вперед, можно сказать, что выполнение несложных правил при составлении Assembler-кода позволяет примерно на порядок повысить производительность программ по сравнению с теми, что получаются в результате применения стандартных оптимизированных компиляторов (например, C++) без применения указанных правил.
Главный ресурс повышения быстродействия программ заключен в переходе на операции без задействования оперативной памяти. Действительно, тактовая частота процессора обычно находится в пределах 3-5 МГц, а тактовая частота шины оперативной памяти (DRAM Frequency), как правило, составляет от 667 до 1067 МГц. При этом основные операции с числами с «плавающей точкой» (умножение, сложение, пересылка и т.д.) современные математические сопроцессоры ПК выполняют за время порядка одного такта и могут производить параллельно до четырех таких операций. Обращение к оперативной памяти при использовании формата Double (64 разряда) требует порядка двух тактов DRAM Frequency. Поэтому операции обращения к оперативной памяти (записи или считывания) выполняются от 6 до 60 раз медленнее базовых операций, выполняемых математическим сопроцессором. Совершенно ясно, что для повышения производительности программного кода нужно по возможности свести к минимуму операции обращения к RAM (оперативной памяти).
Но так как количество регистров, поддерживаемых математическим сопроцессором, ограничено (на текущий момент значением 8), то задача сокращения обращений к оперативной памяти сопряжена с трудностями составления программного кода, работающего в условиях задействования малого числа «ячеек памяти», в качестве которых выступают регистры математического сопроцессора. Программы компиляции для решения таких задач малопригодны. Они не могут «расшифровывать» общее назначение программы и ориентированы на локальную оптимизацию отдельных операций. Базовый принцип программ компиляции состоит в том, чтобы «избегать загрузки» регистров сопроцессора (процессора), используемых исключительно в качестве рабочих элементов, выполняемых на текущем шаге операций. Поэтому даже промежуточные результаты компиляторы всегда записывают в оперативную память, освобождая ограниченный ресурс регистров сопроцессора (процессора).
Как можно видеть, сложившиеся условия требуют изменений подходов к программированию на низком уровне. Повышение производительности предполагает не простой выбор рациональных ассемблерных операций, но и субассемблерную структуризацию кода, которая не может быть выполнена стандартными компиляторами. Значительный эффект при этом дает использование параллельных ассемблерных операций из набора SSE и SSE2, а также (при наличии возможности) переход на использование чисел с «плавающей точкой» формата Single (32 разряда), запись и чтение которых из RAM осуществляется за один такт частоты DRAM Frequency.
Можно сформулировать четыре дополнительных правила программирования на низком уровне, выполнение которых позволит повысить производительность при обработке данных.
1) Заменять «медленные» ассемблерные операции на «быстрые». Например, вместо операции «деления» на 2 использовать операцию «умножения» на 0,5. Или при сравнении модуля вектора с порогом вместо операции вычисления «квадратного корня», применяемой для формируемых статистик, использовать операцию «возведения в квадрат» для порога, применяемую однократно. Ориентироваться на работу с числами с «плавающей точкой» вместо целых значений, так как команды по их обработке выполняются значительно быстрее, чем команды обработки целых значений на центральном процессоре.
2) В цепочках последовательных операций стараться сохранять промежуточные результаты в регистрах сопроцессора, а не в оперативной памяти.
3) Использовать числа с «плавающей точкой» формата Single, позволяющего обеспечить относительную точность представления значений чего вполне достаточно для большинства практических приложений.
4) Задействовать по возможности команды параллельных вычислений (например, SSE, SSE2).
Для выполнения первого правила требуется составить таблицу вычислительных затрат для каждой из команд. Сделать это можно путем многократного повторения заданной операции в фиксированной последовательности, перемежающейся с другими ассемблерными операциями. При этом нужно блок из ассемблерных операций, использованных для перемежения, запустить отдельным циклом, замерить временные затраты и вычесть из временных затрат, замеренных на первом этапе. Путем деления на число повторений в цикле и число операций в одном проходе цикла получим временные затраты на выполнение тестируемой операции.
Автоматизация процесса тестирования команд по вычислительным затратам
Процесс написания «смешанного» кода, состоящего из ряда повторов тестируемой команды и «перемежающих» ее «случайных» операций, имитирующих работу реальной программы, достаточно трудоемок для реализации в режиме «ручного исполнения». Тем более, что для получения достоверных результатов требуется рассмотреть довольно широкий спектр комбинаций перемежения для достаточно большого набора базовых тестируемых команд. Поэтому автоматизация процесса формирования тестируемого кода превращается в самостоятельную задачу, решение которой нужно получить на базе доступных средств программирования. Достаточно удобным средством для автоматизации формирования кода может служить обыкновенная программная среда Excel, функциональные средства которой поддерживают операции копирования, дублирования и перемежения текстовых переменных, содержащихся в отдельных ячейках листов рабочей книги.
На рис. 1 показана схема формирования случайного перемешанного программного кода средствами Excel. В основу положена операция «тасования» содержимого ячеек разных строк выбранного столбца. Первоначально в тасуемых ячейках в строгом порядке следования располагается Nc повторяющихся кодов тестируемой операции и Nh кодов, выбранных для перемежения. Далее в ячейках столбцов, расположенных правее выбранного, организуются последовательно операции попарной замены содержимого ячеек с номерами строк, задаваемыми двумя случайными числами, расположенными в двух «верхних» ячейках над каждым из указанных столбцов. В результате в крайнем правом столбце массива случайного тасования формируется искомый случайно перемешанный код.
Операция попарной замены содержимого может быть реализована на основе простейших встроенных команд Excel следующего вида:
"=EC^^($C4<>H$1; $C4<>H$2);G4;
ЕСЛИ($C4<>H$2; ИНДЕКС^$4^$105;Ш2;1);
ИНДЕКС (G$4:G$105;H$1;1)))
Ввод тестируемой команды "
Ячейка 1
Ячейка 2
Ячейка^
Ячейка 1
Ячейка 2
Ячейка 1 Ячейка 2
ЯчейкаТЧн-!
ЯчсйкаЫп
Ячейка^
Случайное числоК\ Случайное числоК12 Случайное числоК1т
Случайное числоК2! Случайное числоК22 Случайное числоК2т
Т
Ячейка 1 Ячейка 1 1 Ячейка 1
Ячейка 2 Ячейка 2 1 1 Ячейка 2
ЯчейкаК11
ЯчсйкаК1:
ОперацияJ< ИНДЕКС »
ЯчейкаК2!
'перацня «ИНДЕКС» 'перацня «ИНДЕКС»
ЯчейкаК22
ЯчейкаКо+Кь
ЯчейкаКо+Кь
Операция рекуррентного
^ЯчейкаК1!,
к
Операция« ИНДЕКС »
ЯчейкаК"
ЯчейкаКо+Кь
Итог
перемешивания (тасование ячеекУ ________________________________j
Рисунок 1
Здесь C4 - ячейка, задающая номер строки, H1 - ячейка, содержащая первое случайное число с номером строки, участвующей в попарной замене, H2 - ячейка, содержащая второе случайное число с номером строки, участвующей в попарной замене, G - задает «номер» соседнего столбца, стоящего левее текущего. Как можно видеть, если номер строки не совпадает ни с первым ни со вторым случайным числом, то значение из соседнего левого столбца без изменения переносится в текущий столбец. А если номер строки совпадет с одним из случайных значений, то в соответствующую позицию текущего столбца попадет значение из ячейки предыдущего столбца с номером строки, задаваемым другим случайным числом. Указанное действие обеспечивает команда «ИНДЕКС». Знаки «$» используются для фиксации стоящего правее числа или значения литеры в режиме «протаскивания» формулы на соседние ячейки. В результате простое «протаскивание» формулы из ячейки «левого верхнего угла» на все поле действия обеспечит воспроизведение рекуррентного алгоритма «тасования» на нужном фрагменте листа Excel.
На рис. 2, для пояснения приведен «скриншот» листа Excel-файла, реализующего процедуру перемешивания программного кода.
Дополнительная проверка, выполняемая с помощью операции
«=ЕСЛИ($Си>2*Лист1!$С$1; "" ; .....)», применяется исключительно для того, чтобы
формируемый фрагмент перемешанного кода имел заданный размер Ко + Кн, который в данном случае равен удвоенному значению числа, записанного в ячейке Лист1!$С$1.
Выделение из полученного перемешенного кода операций отличных от тестируемой обеспечивает фрагмент, необходимый для измерения затрат на «обрамляющие операции». Эту операцию также можно сделать с помощью встроенных команд Ехое1. Но для этого нужно сформировать несколько вспомогательных столбцов данных. Во-первых - это столбец индикаторов строк, в которых в последнем столбце поля тасования содержатся коды «перемежающих команд». Такая операция в Ехое1 будет иметь вид:
«=ЕСЛИ(С7<>$С$2;1;0)»
m
Здесь С7 - текущая ячейка, содержащая одну из команд перемеженного кода, $С$2 -зафиксированная ячейка С2, содержащая код тестируемой операции. Как только текущая команда не совпадает с тестируемой, то во вспомогательном столбце размещается 1, в противном случае - 0._
i г з Файл Главная Вставка Разметка страницы Формуле Ф Я С 3 л Дан ные Рецензирование P подготовка блоков для засечки XMM - копия.xlsx - Excel Вхо Вид О Что вы хотите с^—ать? О Ш - □ Я Поде X 'ЭУ'™
ЕСЛИ X ч/ f, =£0/111(5^4^*/! ист1!$С$1;"";ЕСЛ И (И($С4<>Н51;?С'1с>Н $2);С4;ЕСЛИ($С4<^Н$2;ИНДЕКС(С$4:С5105;Н$2; l);HHflEKC(GS4:G$105;H$l;l)))J v 1
ABC D Е F G I ЕСЛИ(лог выражение: [значение если истина]; [значение если ложь]) | J К L М N
2_
¿11 6 24| 3l| 2l| 22
3 5
___ 1 1 Imovaps xmmO^mml Т 2 "su bps «mm0,xm m0 pshufd xmmO.xmml, pshufd xmmO,xmml. 100 100 SC4«HS2),G4;E01M(SC-pshufd xmm0,xmml,l 00 iMHpshufd xmmO,xmml,l 00 00 b pshufd xmmo'xmml'l 0010 0010 lb pshufd xmmO,xmml,110010: lb pshufd xmmO,xmml,110010: íb Shu dx ShüÍdx Shu!
6 7 3 movaps <mmC,xmrril 4 movHLps xmml,xmm0 5 pshufd xmm7, xmmO, 253 pshufd xmmO.xmml, pshufd xmmO,xmml, pshufd xmmO.xmml, 100 100 100 11b pshufd xmm0,xmml,l 00 00 00 Ь pshufd xmmO,xmm 1,1 00 00 00 b pshufd xmmO^xmml'l 0010 0010 0010 lb pshufd xmmO,xmml,110010: lb pshufd xmmO,xmml,110010: lb pshufd xmmO,xmml,110010: íb Jshu dx Shufd x Shu!
9 10 6 subps xmml,xmm7 7 movHLps xmmO^mml 8 pshufd xmml, xmm 1, 243 pshufd xmmO,xmml, pshufd xmmO.xmml, pshufd xmmO,xmml. 100 100 100 1= pshufd xmm0,xmml,l pshufd xmm0,xmml,l 00 00 b pshufd xmmO,xmm 1,1 b pshufd xmmO,xmm 1,1 00 00 t> pshufd xmmO,xmml,l b pshufd xmmO,xmml,l 0010 0010 lb pshufd xmmO,xmml,110010: movaps xmmO,xmml lb pshufd xmmO,xmml,110010: I S £ Si
13 9 a dd ps хттОдш mo 10 movlps qword ptr [ed¡*64),xmml pshufd xmmO.xmml, pshufd xmmO,xmml. 100 iz pshufd xmm0,xmml,l 00 b pshufd xmmO,xmm 1,1 00 b pshufd xmmO,xmml,l 0010 lb pshufd xmmO,xmml,110010: lb pshufd xmmO,xmml,110010: lb pshu Shufd x Shu!
15 11 movlps qword ptr [edi*128),xmm0 12 pshufd xmml,xmml,00011111b pshufd xmmO.xmml, 100 ш pshufd xmm0,xmml,l 00 b pshufd xmm0,xmm 1,1 00 b pshufd xmm0.xmml,l 0010 lb pshufd xmmOjimml,110010: lb pshufd xmm0.xmml, 110010: lb pshu Shufd x Shu!
17 13 movLH ps xmm0,xm ml 14 movlps qword ptr [ed»-64],xmm0 pshufd xmmO.xmml, pshufd xmmO,xmml. 100 lib pshufd xmm0,xmml,l 00 Ь pshufd xmm0,xmm 1,1 00 b pshufd xmm0.xmml,l 0010 lb pshufd xmmOjimml,110010: lb pshufd xmm0.xmml,IIOOIO: lb pshu ri" Shufd * Shu!
IS 15 pshufd xmml,xm m lr01101100b pshufd xmmO,xmml, 100 lib pshufd xmmO,xmml,l 00 b pshufd xmmO,xmm 1,1 00 b pshufd xmm0,xmml,l 0010 lb pshufd xmmO,xmml,IIOOIO: lb pshu dx pshufd x pshuf
19 16 addps xmm0,xmml pshufd xmmO,xmml. 100 lib pshufd xmm0,xmml,l 00 b pshufd xmmO,xmm 1,1 00 b pshufd xmm0.xmml,l 0010 lb pshufd xmm0.xmml,IIOOIO: lb pshu pshufd x pshuf
20 17 su bps xmmOpon m 1 pshufd xmmO,xmml, 100 lib pshufd xmmO,xmml,l 00 b pshufd xmmO,xmm 1,1 00 b pshufd xmm0,xmml,l 0010 lb pshufd xmmO,xmml,IIOOIO: lb pshu dx pshufd x pshuf
21 18 mulps xmml,xmml pshufd xmmO,xmml. 100 lib pshufd xmm0,xmml,l 00 b pshufd xmmO,xmm 1,1 00 b pshufd xmm0.xmml,l 0010 lb pshufd xmm0.xmml,IIOOIO: lb pshu pshufd x pshuf
22 19 mulps xmmlpcmmO pshufd xmmO,xmml, 100 lib pshufd xmmO,xmml,l 00 b pshufd xmmO,xmm 1,1 00 b pshufd xmm0,xmml,l 0010 lb pshufd xmmO,xmml,IIOOIO: lb pshu dx pshufd x pshuf
23 20 pslldq xmm 1,2 pshufd xmmO,xmml. 100 lib pshufd xmm0,xmml,l 00 b pshufd xmmO,xmm 1,1 00 b pshufd xmm0.xmm 1,1 0010 lb pshufd xmm0.xmml,IIOOIO: lb pshu dx pshufd x pshuf
24 21 psrldq xmm0,2 pshufd xmmO,xmml, 100 lib pshufd xmmO,xmml,l 00 b pshufd xmmO,xmm 1,1 00 b pshufd xmm0,xmml,l 0010 lb pshufd xmmO,xmml,IIOOIO: lb pshu dx pshufd x pshuf
25 22 subps xmm4,xmm0 pshufd xmmO,xmml. 100 lib pshufd xmm0,xmml,l 00 b pshufd xmmO,xmm 1,1 00 b pshufd xmm0.xmm 1,1 0010 lb pshufd xmm0.xmml,IIOOIO: lb pshu dx mulps xn mulps
26 23 su bps xmmljxm m S pshufd xmmO,xmml, 100 lib pshufd xmmO,xmml,l 00 b pshufd xmmO,xmm 1,1 00 b pshufd xmm0,xmml,l 0010 lb pshufd xmmO,xmml,IIOOIO: lb pshu dx pshufd x pshuf
27 24 subps xmm0,xmm4 pshufd xmmO,xmml. 100 lib pshufd xmm0,xmml,l 00 b pshufd xmmO,xmm 1,1 00 b pshufd xmm0.xmm 1,1 0010 lb pshufd xmm0.xmml,IIOOIO: lb pshu dx pshufd x pshuf
28 25 subps xmmljxmmo pshufd xmmO,xmml, 100 lib pshufd xmmO,xmml,l 00 b pshufd xmmO,xmm 1,1 00 b pshufd xmm0,xmml,l 0010 lb pshufd xmmO,xmml,IIOOIO: lb pshu pshufd x pshuf
29 _ 26 movaps xmml,xmm0 pshufd xmmO.xmml, 100 lib pshufd xmm0.xmml,l 00 b pshufd xmm0.xmm 1,1 00 b pshufd xmm0.xmm 1,1 0010 lb pshufd *m mO.xmml, 110010: lb pshu dx pshufd X pshuf
31_ 28 movaps хттб.хттО pshufd xmmO.xmml, 100 i pshufd xmmO,xmml,l pshufd xmm0,xmml,l 00 b pshufd xmmO,xmm 1,1 b pshufd xmmO,xmml,l 00 b pshufd xmmlxmm l' 1 0010 lb pshufd xmm0.xmml,110010: 1L pshu dx s ShuÍ
33_ 29 movHLps xmmI,xmm3 30 pshufd xmml, xmml, 253 pshufd xmmO.xmml, 100 lib pshufd xmmO,xmml,l pshufd xmm0,xmml,l 00 b pshufd xmmO,xmm 1,1 b pshufd xmmO,xmml,l 00 I pshufd xmmo]xmm l' 1 0010 lb pshufd xmm0.xmml,110010: t Shu dx gSü Shu!
35_ 36 32 movHLps xmmQ,xmm4 33 pshufd xmml, xmm7, 243 pshufd xmmO.xmml, pshufd xmmO,xmml. 100 100 § pshufd xmmO,xmml,l pshufd xmm0,xmml,l pshufd xmm0,xmml,l 00 00 b pshufd xmmO,xmml,l b pshufd xmmO,xmm 1,1 00 00 b pshufd xmmO,xmml,l 0010 0010: lb pshufd xmm0.xmml,110010: lb pshufd xmmO,xmml,110010: £ s: Ü: iü Si
37 _ 3S 34 addps xmml,xmni6 35 movlps qword ptr [edi*64),xmm0 36 movlps qword ptr [edi*128],xmml 37 pshufd xmml,xm m 1,00011111b pshufd xmmO.xmml, pshufd xmmO,xmml, pshufd xmmO.xmml, pshufd xmmO,xmml. 100 100 100 100 1 pshufd xmm0,xmml,l pshufd xmm0,xmml,l 00 00 00 00 b pshufd xmmO,xmm 1,1 b pshufd xmmO,xmm 1,1 00 00 00 00 b pshufd xmmO,xmml,l b pshufd xmmO,xmml,l 0010: 0010: 0010: 0010: lb pshufd xmmO,xmml,110010: lb pshufd xmmO,xmml,110010: lb pshufd xmmO,xmml,110010: lb pshufd xmmO,xmml,110010: I Ш si Si 55
¡j su movLH ps хттвдт m4 39 movlps qword ptr [ed»-64),xmml 40 pshufd xmm0,xmm0,01101100b 41 addps xmm0,xmml 42 subps xmml,xmmQ pshufd xmmO.xmml, pshufd xmmO,xmml, pshufd xmmO.xmml, subps xmm0,xmm0 100 100 I pshufd xmm0,xmml,l pshufd xmm0,xmml,l subps xmmO,xtnmQ 00 00 00 b pshufd xmmO,xmm 1,1 b pshufd xmmO,xmm 1,1 subps xmmO,xmmO 00 00 00 b pshufd xmmO,xmml,l b pshufd xmmO,xmml,l su bps xm mO,xmmO 0010: 0010: 0010: lb pshufd xmmO,xmml,110010: lb pshufd xmmO,xmml,110010: lb pshufd xmmOjcmml,IIOOIO: lb pshufd xmmO,xmml,110010: subps xmmO.xmmO s S £ subps xn s
50 52 54 43 mulps xmmlpcmmO 44 mulps xmml,xmml 45 pslldq xmm 1,2 46 psrldq xmm 1,2 47 subps xmm4,xmm0 49 subps xmml,xmm4 51 mulps xmm6,xmml m ovHLps xm ml,xmmO pshufd xmm7, xmmO, 253 subps xmml,xmm7 m ovHLps xm mO.xmml addps xmmO.xmmO movlps qword ptr [ed 1*64],xmml movlps qword ptr [edi*128],xmmO movHLps xmmljimmO movHLps xmmljimmO movHLps xmml,xmmQ movHLps xmml,xmmO movMLps movHLps movML pshufd xmm7, xmmO, 253 pshufd xmm7, xmmO, 253 pshufdxmm7.xmm0, 253 pshufd xmm7. xmmO. 253 pshufd xi pshufd xi pshufc subps xmml,xmm7 subps xmml,xmm7 subps xmml,xmm7 subps xm ml,xmm7 subps xrr subps xrr subps movHLps xmmO;xm ml movHLps xmmO;xm ml movHLps xmmO^mml movHLps xmmO,xmml movHLps movHLps movHL movlps qword ptr [edi+64],xmm: movlps qword ptr [edi+64],xmml movlps qword ptr [edi+64],xmml movlps qword ptr [edi+64],xmml movlps q movlps q movlp: movlps qword ptr [edi+128],xmn movlps qword ptr [edi+128],xmm0 movlps qword ptr [edi*128],xmm0 movlps qword ptr [edi*128],xmm0 movlps q movlps q movlp: pshufd xmml,xmm 1,00011111b pshufd xmml,xmml,00011111b pshufd xmmlptmml,00011111b pshufd xmml,xmml,00011111b pshufd xi pshufd xi pshufc
| Лист! Лист2 © » н 1 НИШ--!-+ 8091
Рисунок 2
Во-вторых, в соседнем слева от первого вспомогательного столбца нужно сформировать второй вспомогательный столбец, который будет содержать порядковые номера перемежающих команд в сформированном коде. Для этого нужно зафиксировать в ячейке выше первой нулевое значение и после этого в первую ячейку (например, М7) второго вспомогательного столбца поместить формулу: «=М6+Ш»
Здесь М6 - ячейка, содержащая исходное 0 значение второго вспомогательного столбца, N - литера первого вспомогательного столбца, содержащего значимые данные, начиная со строки номер 7. После чего следует «протащить» указанную формулу до последней позиции второго вспомогательного столбца. И в-третьих, с помощью операции вертикального поиска «ВПР» построить третий вспомогательный столбец, содержащий без пробелов список номеров позиций перемежающих команд. Для этого необходимо ввести в верхнюю строку третьего вспомогательного столбца команду: «=ВПР(А7;$М$7:$0$106;3;0)»
и выполнить ее «протяжку» до последней строки третьего вспомогательного столбца. Здесь ячейки столбца «А», начиная со строки 7, содержат возрастающий ряд целых значений, задающих порядковый номер некоторой «перемежающей» команды на множестве перемежающих команд. Номера, в столбце «0» содержат порядковые номера всех команд в общем «перемешанном» коде. Операция «ВПР» формирует поиск в столбце «М» порядкового номера очередной «перемежающей» команды и после его обнаружения извлекает из столбца «0» общий номер, соответствующий данной «перемежающей» команде в «перемешанном»
36
коде. После этого с помощью введения и «протяжки» операции «ИНДЕКС», рассмотренной выше, формируется столбец данных, в ячейках которого содержится код из одних «перемежающих» команд. Его нужно использовать в программе тестирования для исключения из временных затрат компоненты, связанной с «обрамляющей составляющей».
В режиме автоматического выполнения вычислений Excel при любом изменении выполняет заново генерацию случайных чисел в соответствующих ячейках, что сразу приводит к новым реализациям перемешенного кода и фрагмента «перемежающих» команд. Для этого достаточно просто нажать кнопку «Delete», разместив курсор на любой пустой ячейке активного листа. После этого сформированные фрагменты кодов можно перенести в среду редактора кода (например, Delphi или Си) с помощью обычных операций обмена «Copy -Paste», то есть, через «карман» обмена пользовательского интерфейса ОС Windows.
На рис. 3 показан «скриншот» рабочего листа файла Excel, на котором указанным способом формируются перемешанный код и код из перемежающих команд (операций). Видно, что на Листе1, в ячейке «C1» задается число повторений тестируемой операции в перемешанном коде. В данном случае это число также задает и количество перемежающих команд. В ячейку «C2» заносится код тестируемой команды. В данном случае это команда SSE: pshufd xmm0, xmml, 11001011b. Список перемежающих команд также доступен для изменения. В рассматриваемом варианте Excel-программы он размещается на Листе 2, в 100 ячейках столбца «D», что можно видеть на рис. 2.
Результаты тестирования вычислительных затрат на команды SSE
На основе предложенного подхода к решению задачи был создан инструмент быстрого формирования перемешанного кода, пригодный для тестирования временных затрат выполнения заданных команд процессора и/или математического сопроцессора.
В табл. 1 показаны результаты, полученные таким способом для ряда команд SSE.
Красным фоном подкрашены операции, показавшие самое медленное выполнение. Видно, что таковыми являются операции деления и вычисления квадратного корня. Они выполняются примерно в 7,3 раза медленнее операций умножения и примерно в 12 раз медленнее операций сложения и вычитания. Светло-коричневым цветом подкрашены операции чтения из RAM 128-разрядных данных в регистр XMM (SSE). Видно, что такие операции выполняются примерно в 4,5 раза медленнее, чем чтение из RAM 64-разрядных данных (последние операции составляют подмножество из подкрашенных зеленым цветом). Поэтому лучше выполнить последовательно две операции чтения 64-разрядных данных, чем одну операцию чтения 128-разрядных данных. Желтым фоном подкрашены операции записи в RAM из регистра XMM (SSE) 128-разрядных данных. Как можно видеть, такая операция занимает примерно в два раза больше времени, чем запись 64-разрядных данных (последние операции составляют подмножество из подкрашенных зеленым цветом). Все остальные операции занимают время в пределах одного такта.
Некоторый разброс показаний в таблице объясняется тем, что ОС Windows не поддерживает монопольную работу программ, и часть времени потребляется на нужды системы. Это случайным образом сказывается на результатах измерений. Но в целом разброс показаний при больших выборках оказывается небольшим, что позволяет однозначно классифицировать команды по потребляемому ресурсу времени выполнения.
В принципе инструментарий Excel достаточно удобен и для решения других задач, связанных с оптимизацией низкоуровневого кода. Например, конвейерная организация выполнения команд, реализуемая на платформах современных ПК, предполагает распараллеливание операций, обладающих свойством независимости. Но для этого необходимо, чтобы команды, непосредственно следующие за текущей командой, не содержали в качестве операндов (в рассматриваемом случае операндами являются регистры XMM) операнд-приемник текущей команды. В противном случае их выполнение может начинаться только после завершения текущей команды и распараллеливание вычислений становится
невозможным. Для обнаружения подобных ситуаций с «конфликтами» операндов также может использоваться инструментарий Excel.
f=t - Главная Вставка Разметка страницы Формулы дготовка д.. засечки XMM - копия,«.» - Excel Данные Рецензирование Вид Q Что вы В код т □
1« | X J& pshufd ктпЮ.хг nml UOOlOllb ' I
А В с a E F <3 H 1 1 K О р Q R , 5 , 1^1
горений icLinpicwufi операции.
г
■*
1
movlps qword ptr [ecn-*Mj,xrnma 1 1 movlps qword ptr [«01*И].хтт1
а I psnufd nmml. хп-im/. 243 1 2 2
pshuid *mmO.*mm 1.UOOlOllb
11 ndclpr. ктml,ктme I 1 1 s 1 subps wmml'xrnmO
ad a ps xmml.xmm6 pslldci *mml,2 i. 6 pslldq xmml.2
«Ьр^ГтТтгго'' "OOlOl lb 1 1 1 " I ГьГ-т'тТттТ *
£shufd "mma"mmi;iio01oiib subp= 6 11
movHLps xmmo.xmma
20 ^OTHLpT^mol^rni * ■ " л и pshufd ит ml. xmml, 243
3« ii rviovipi qworo ptr (#вщгв1,*тгпа
аз "uC^mZirr0 £ 31 17 11 " "»mmTmmT0
8 нт то 11 si iv pshufd кт ml,кт m l.OOOl 111 lb " 11 movlps qword ptr [fdi.M].«mma
S НЕЕ J.xmmO ал зл J: I; "
movlps qword ptr [edhl!E|,xmml movHLps vmml.KmmO subps ктт1.ктт7 И 27
psridq xmmO.2
36 pshufd HmтО.ктm 1. llOOlOl lb su Ьр^ГтТ-ГтТ'1'1101 OOb 11 М " - '„"'".^'i."',^''1' 1
pshu'o xmmi.xmrvii.oooiiiaie
movl ps a word per (ed 1-64]
39 move ps »ттб.лтто 1 20 33 и as
41 pshufd >mm0.»mml.n00iailb pshufd иггтО.итm 1.liOOlOilb т^м'фЛтт 1 TriTmi2 53 о 20 SS " к Tnvhlr.'.v^m v^T.,
movlps qword ptr [eO«Ml*minO movLHps xmmO.xmm-»
44 pshufd иттО.ктrmO.Ol Ю1 lOOb pshufd KmmO.xmml.llOOlOllb pshufd xmml.nminl.OOCm: Lllb О 22 М v= „ pshufd л......- «-,",.1 253 77 К ,. Г .. .f . И . .. 'ИТ .'*>!' 1 1 1 .
7» 1 nnovaps m 1,4mmo
47 pshufd кттО.ктml.HQOlQl lb movl ps qword ptr |idM2iUmmO movl ps qword ptr (edi-S4] movl ps qword ptr [ffd»S4]. !кттО 23 Й1 no Л® m.,1.. gnard шгГ=й|.И1.шт1
50 pshufd "ZniuiOOlOllb О 23
*i Wz °
55 чв pshufd кттО.кт ml. UOOlOllb pshufd кттО.ктml.l 100101 lb о 25 Л9 ■и. H
| | ЛИСТ2 | © ca
Ю [cE ra - -■ -+ acte |
Рисунок 3
Таблица 1
Операция Такты Операция Такты Операция Такты
addps xmm0,xmm1 1,13 movHLps xmm0,xmm1 0,85 pslldq xmm0,4 0,79
addps xmm1,xmm1 1,11 movHLps xmm1 ,xmm0 0,75 pslldq xmm0,8 0,76
andpd xmm0,xmm7 0,9 movLHps xmm1 ,xmm0 0,88 pslldq xmm0,1 0,87
andps xmm0,xmm7 0,85 movLHps xmm1 ,xmm1 1 pslldq xmm0,3 0,72
divps xmm5,xmm3 13,5 movlpd xmm0,qword ptr r1 0,95 psrldq xmm0,6 0,68
divss xmm5,xmm3 13,6 movq2dq xmm1,mm0 0,06 punpcklqdq xmm0,xmm0 0,84
mulps xmm0,xmm7 1,8 movsd xmm1,xmm3 0,86 punpcklqdq xmm0,xmm1 1,05
mulss xmm1,xmm3 1,9 movupddqwordptr b1 ,xmm0 2,6 rcpps xmm3,xmm3 1,82
movaps xmm7,xmm0 0,65 movupsdqwordptr [edi],xmm0 2,5 rcpps xmm5,xmm3 0,5
movdeax,xmm0 0,7 movssdwordptr [edi],xmm0 1,25 sqrtps xmm4,xmm0 13,8
movd xmm0,eax 0,75 movsd qword ptr [edi],xmm0 1,12 sqrtps xmm7,xmm7 13
movdq2q mm0,xmm1 0,75 movlps qword ptr [edi],xmm0 1 sqrtss xmm1,xmm7 12,9
movdqu xmm0,dqword ptr b1 4,37 movq qword ptr b1,xmm0 1,16 sqrtss xmm7,xmm7 10,8
movups xmm0,dqword ptr [edi] 4 movups xmm0,xmm1 0,6 subpd xmm0,xmm0 1,16
movupd xmm0,dqword ptr b1 4,4 orpd xmm0,xmm7 0,81 subpd xmm0,xmm7 1,73
movHpd xmm0,qword ptr [edi] 1 orps xmm0,xmm0 0,66 subps xmm0,xmm0 1,13
movhps xmm1,qword ptr [edi] 1,03 orps xmm1,xmm0 1 subps xmm0,xmm1 1,3
movlps xmm1,qword ptr [edi] 0,8 pshufd xmm0,xmm0,10001011b 0,75 xorpd xmm1,xmm0 1,07
movq xmm0,qword ptr b1 0,25 pshufd xmm0,xmm1,11001011b 0,75 xorps xmm1,xmm7 0,95
movdqu xmm0,xmm1 0,47 pshufd xmm1,xmm1,11100111b 0,75
movHLps xmm0,xmm0 1 pslldq xmm0,12 0,86
В завершении представляется важным указать на то, что для применения последнего из указанного перечня правил повышения производительности (правила 4), необходимо выполнить специфические дополнительные условия. Они связаны с тем, что перед выполнением параллельной операции нужно разместить данные формата Single в правильном порядке в четырех 32-разрядных фрагментах регистров XMM. Поэтому наиболее часто выполняемыми оказываются операции перестановки, число различных вариантов которых составляет 4!=24. Но в перечень SEE команд входит команда «pshufd» (или shufps), позволяющая в среднем за 0,75 такта переконфигурировать в любом порядке расположение данных из четырех 32-разрядных фрагментов любого регистра XMM и одновременно поместить полученный результат в этот или любой другой регистр XMM. В результате указанную трудность удается преодолеть. Но, конечно, при написании программного кода следует стремиться располагать данные в 32-разрядных фрагментах (подрегистрах) так, чтобы число необходимых операций перестановки было как можно меньше.
Заключение
Предложен подход тестирования вычислительных затрат для SSE команд ассемблерного кода на базе полуавтоматического режима формирования перемешанных программных кодов с помощью Excel-программ. Представлены табличные данные по вычислительным затратам для основных SSE команд, полученные с помощью указанного подхода. Полученные результаты могут быть применены для широкого перечня программ реального времени, реализуемых на платформе ПК. В частности, представленные результаты были с успехом использованы для оптимизации программ обработки OFDM сигналов сотовых сетей, которые в итоге превзошли по эффективности даже результаты, демонстрируемые на основе метода параллельных вычислений CUDA.
Литература
1. Шорин О.А., Бокк Г.О. Влияние размера ресурсного блока сигнала OFDM на показатели качества работы сетей стандартов LTE и McWILL // Электросвязь, 2017. - № 2. - С. 67-71.
2. Бокк Г.О. MIMO: Оптимизация управления числом логических каналов // Электросвязь, 2017. - № 1. - С. 40-44.
3. Бокк Г.О. MIMO: Оптимизация управления числом логических каналов // Сборник материалов (тезисов) 38-й международной конференции РАЕН «Мобильный бизнес: перспективы развития и реализации систем радиосвязи в России и за рубежом». Шри-Ланка, 2016. - С. 6.
4. Бокк Г.О. Оптимизация MIMO с введением управления числом логических каналов // Сборник трудов 30-й международной конференции РАЕН. Региональное отделение Российской Академии Естественных Наук «Экономика и качество систем связи» и ЗАО «НИРИТ». Малайзия, 2011. - С. 97-109.
5. Бокк Г.О. Повышение эффективности работы систем связи на основе пространственно-временной обработки и спектрального анализа сигналов: Диссертация на соискание ученой степени д.т.н.: 05.12.17. - Москва, 2000. - 396 с.
6. Шорин О.А., Бокк Г.О. Особенности планирования сети McWILL с учетом электромагнитной совместимости с сетями LTE в смежных диапазонах частот // Электросвязь, 2017. - № 2. - С. 46-51.
7. Шорин О.А., Бокк Г.О., Сухацкий С.В. Методы улучшения межсистемной ЭМС для систем мобильной связи четвертого поколения // Электросвязь, 2016. - № 2. - С. 35-41.
8. Шорин О., Бокк Г. Анализ электромагнитной совместимости стандартов четвертого поколения // Первая миля, 2016. - № 1 (54). - С. 44-53.
9. Шорин О.А., Бокк Г.О. К вопросу об электромагнитной совместимости стандартов четвёртого поколения // Экономика и качество систем связи, 2016. - № 2. - С. 51-59.
10. Шорин О.А., Бокк Г.О. К вопросу об электромагнитной совместимости стандартов
B9
четвёртого поколения // Сборник материалов (тезисов) 37-й международной конференции РАЕН «Мобильный бизнес: перспективы развития и реализации систем радиосвязи в России и за рубежом». Италия, 2016. - С. 4-6.
11. Шорин О.А., Бокк Г.О. Эквалайзер для коррекции мультидоплеровских искажений OFDM-сигналов в сетях LTE и McWILL // Электросвязь, 2017. - № 1. - С. 28-34.
12. Шорин О.А., Бокк Г.О. Эквалайзер для коррекции мультидоплеровских искажений OFDM сигналов в сетях LTE и McWILL // Сборник материалов (тезисов) 38-й международной конференции РАЕН «Мобильный бизнес: перспективы развития и реализации систем радиосвязи в России и за рубежом». Шри-Ланка, 2016. - С. 4.
13. Аверьянов Р.С., Бокк Г.О., Шорин А.О. Оптимизация размера кольцевой антенны и правила формирования территориальных кластеров для сотовой сети McWILL // Электросвязь, 2017. -№ 1. - С. 22-27.
14. Шорин О.А., Бокк Г.О., Аверьянов Р.С., Шорин А.О. Оптимизация геометрии адаптивной антенны для сотовой сети с OFDM сигналами // Экономика и качество систем связи, 2016. - № 2. - С. 60-67.
15. Шорин О.А., Бокк Г.О., Аверьянов Р.С., Шорин А.О. Оптимизация геометрии адаптивной антенны для сотовой сети с OFDM сигналами // Сборник материалов (тезисов) 37-й международной конференции РАЕН «Мобильный бизнес: перспективы развития и реализации систем радиосвязи в России и за рубежом». Италия, 2016. - С. 7-8.
ОПТИМИЗАЦИЯ АССЕМБЛЕРНОГО КОДА БПФ, ОРИЕНТИРОВАННОГО НА ОБРАБОТКУ OFDM СИГНАЛОВ СОТОВЫХ СЕТЕЙ СВЯЗИ
Г.О. Бокк, директор по науке ООО «НСТТ», д.т.н., bokkg@yandex.ru
УДК 621.391
Аннотация. Рассматривается метод увеличения производительности ассемблерной программы БПФ/ОБПФ, использующий SSE команды параллельного вычисления. Указываются скрытые вычислительные резервы, содержащиеся на субкомпиляционном уровне. Приведен код ядра программы и экспериментальные данные, подтверждающие доступность обработки на приеме одним ПК класса i3 - CPU 3,70 GHz группового сигнала LTE с рабочей полосой до 40 МГц.
Ключевые слова: вычислительные затраты; ассемблер; SSE команды; БПФ; ОБПФ; LTE; OFDM.
OPTIMIZATION OF THE FFT ASSEMBLER CODE ORIENTED ON THE PROCESSING OF OFDM SIGNALS OF CELLULAR COMMUNICATION NETWORKS
German Bokk, director for science of LLC «NXTT», doctor of technical sciences
Annotation. The method of increasing the performance of the FFT/OBPF assembler program using the SSE parallel calculation commands is considered. The latent computational reserves contained at the subcompilation level are indicated. The code of the program core and the experimental data confirming the availability of processing at the reception of one PC class i3 - CPU 3.70 GHz of a group LTE signal with a working band of up to 40 MHz are given.
_Keywords: computing costs; assembler; SSE commands; FFT; IFFT; LTE; OFDM._