Профессиональное программирование на ассемблере x64 с расширениями AVX, AVX2 и AVX-512
Покупка
Новинка
Тематика:
Программирование на C и C++
Издательство:
ДМК Пресс
Автор:
Куссвюрм Даниэль
Перевод:
Яценков Валерий Станиславович
Год издания: 2021
Кол-во страниц: 628
Дополнительно
Вид издания:
Практическое пособие
Уровень образования:
Дополнительное образование
ISBN: 978-5-97060-928-6
Артикул: 833975.01.99
В книге рассматривается программирование для 64-разрядной архитектуры x86 и использование расширенного набора векторных команд (AVX). Изучив этот материал, вы сможете кодировать быстродействующие функции и алгоритмы с использованием 64-разрядного языка ассемблера x86 и расширений набора команд AVX, AVX2 и AVX-512. Примеры исходного кода разработаны с использованием Visual Studio C++ и MASM; для их запуска рекомендуется ПК на базе x86 с 64-разрядной ОС Windows 10 и процессором, поддерживающим AVX. Предполагается, что читатели имеют опыт программирования на языках высокого уровня и базовые знания C++. Основная аудитория книги - разработчики программного обеспечения, которые хотят научиться писать код с использованием языка ассемблера x86-64, а также те, кто уже имеет базовые представления о программировании на 32-битном или 64-битном языке ассемблера x86 и стремится узнать, как использовать возможности SIMD в AVX, AVX2 и AVX-512.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 02.03.02: Фундаментальная информатика и информационные технологии
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Даниэль Куссвюрм Профессиональное программирование на ассемблере x64 с расширениями AVX, AVX2 и AVX-512
Modern X86 Assembly Language Programming Covers x86 64-bit, AVX, AVX2, and AVX-512 Second Edition Daniel Kusswurm
Профессиональное программирование на ассемблере x64 с расширениями AVX, AVX2 и AVX-512 Даниэль Куссвюрм Москва, 2021
УДК004.4 ББК32.972 K94 ДаниэльКуссвюрм К94Профессиональноепрограммированиенаассемблереx64срасширениямиAVX,AVX2иAVX512 /пер.с анг.В. С. Яценкова. –М.:ДМКПресс,2021. –628 с.: ил. ISBN978-5-97060-928-6 Вкнигерассматриваетсяпрограммированиедля64разряднойархитектурыx86ииспользованиерасширенногонаборавекторныхкоманд(AVX).Изучивэтотматериал,высможетекодироватьбыстродействующиефункциииалгоритмысиспользованием64разрядногоязыкаассемблераx86ирасширенийнаборакомандAVX,AVX2иAVX512. ПримерыисходногокодаразработанысиспользованиемVisualStudioC++иMASM;дляихзапускарекомендуетсяПКна базеx86с64разряднойОСWindows10ипроцессором,поддерживающимAVX. Предполагается,чточитателиимеютопытпрограммированиянаязыкахвысокогоуровняибазовыезнанияC++.Основнаяаудиториякниги–разработчикипрограммногообеспечения,которыехотятнаучитьсяписатькодсиспользованиемязыкаассемблераx8664,атакжете,ктоужеимеетбазовыепредставленияопрограммированиина32битномили64битномязыкеассемблераx86и стремитсяузнать,какиспользоватьвозможностиSIMDвAVX,AVX2иAVX512. УДК004.4 ББК32.972 ModernX86AssemblyLanguageProgramming;Coversx8664bit,AVX,AVX2,and AVX512byDanielKusswurm,edition:2 Copyright©DanielKusswurm,2018* ThiseditionhasbeentranslatedandpublishedunderlicencefromAPressMedia,LLC,partofSpringerNature. APressMedia,LLC,partofSpringerNaturetakesnoresponsibilityandshallnotbemadeliablefortheaccuracyofthetranslation. Всеправазащищены.Любаячастьэтойкнигине можетбытьвоспроизведенав какойбытонибылоформеи какимибытонибылосредствамибезписьменногоразрешениявладельцевавторскихправ. ©2018byDanielKusswurm ©Оформление,издание,перевод,ДМКПресс,2021 ISBN(анг.)9781484240625 ISBN(рус.)9785970609286
Оглавление Предисловие от издательства...................................................................11 Об авторе...........................................................................................................12 О техническом редакторе...........................................................................13 Благодарности.................................................................................................14 Вступление........................................................................................................15 О чем эта книга...............................................................................................16 Глава 1. Архитектура ядра x86-64..........................................................19 1.1.Историческийобзор..................................................................................19 1.2.Типыданных..............................................................................................22 1.2.1.Основныетипыданных......................................................................22 1.2.2.Числовыетипыданных......................................................................24 1.2.3.ТипыданныхSIMD.............................................................................24 1.2.4.Прочиетипыданных..........................................................................26 1.3.Внутренняяархитектура...........................................................................26 1.3.1.Регистрыобщегоназначения............................................................27 1.3.2.РегистрRFLAGS..................................................................................29 1.3.3.Указателькоманд................................................................................31 1.3.4.Операндыкоманд...............................................................................32 1.3.5.Адресацияпамяти...............................................................................33 1.4.Различиямеждупрограммированиемx8664и x8632..........................35 1.4.1.Недопустимыекоманды.....................................................................37 1.4.2.Устаревшиекоманды.........................................................................38 1.5.Обзорнаборакоманд.................................................................................38 1.6.Заключение................................................................................................41 Глава 2. Программирование ядра x86-64. Часть 1..........................42 2.1.Простаяцелочисленнаяарифметика.......................................................42 2.1.1.Сложениеи вычитание.......................................................................43 2.1.2.Логическиеоперации.........................................................................46 2.1.3.Операциисдвига.................................................................................49 2.2.Расширеннаяцелочисленнаяарифметика..............................................53 2.2.1.Умножениеи деление.........................................................................53 2.2.2.Вычисленияс использованиемсмешанныхтипов..........................57
2.3.Командыадресациипамятии состояния................................................63 2.3.1.Режимыадресациипамяти................................................................63 2.3.2.Условныекоманды.............................................................................68 2.4.Заключение................................................................................................72 Глава 3. Программирование ядра x86-64. Часть 2 .........................74 3.1.Массивы......................................................................................................74 3.1.1.Одномерныемассивы.........................................................................74 3.1.2.Двумерныемассивы...........................................................................81 3.3.Строки.........................................................................................................94 3.3.1.Подсчетсимволов...............................................................................94 3.3.2.Конкатенациястрок............................................................................97 3.3.3.Сравнениемассивов.........................................................................103 3.3.4.Обращениемассива..........................................................................106 3.4.Заключение..............................................................................................110 Глава 4. Векторное расширение набора команд AVX...................111 4.1.ОбзорAVX.................................................................................................111 4.2.КонцепциипрограммированияSIMD....................................................113 4.3.Арифметикас переносомилиарифметикас насыщением?................114 4.4.СредавыполненияAVX...........................................................................116 4.4.1.Наборрегистров................................................................................116 4.4.2.Типыданных.....................................................................................117 4.4.3.Синтаксискоманд.............................................................................118 4.5.СкалярныевычисленияAVXс плавающейзапятой..............................119 4.5.1.Концепцияпрограммированияс плавающейзапятой..................119 4.5.2.Наборскалярныхрегистровс плавающейзапятой........................123 4.5.3.Региструправленияи состояния.....................................................123 4.5.4.Обзорнаборакоманд........................................................................125 4.6.Операциис упакованнымичисламис плавающейзапятойв AVX......126 4.6.1.Обзорнаборакоманд........................................................................129 4.7.Операциис упакованнымицелымичисламив AVX..............................130 4.7.1.Обзорнаборакоманд........................................................................131 4.8.Различиямеждуx86AVXи x86SSE.......................................................133 4.9.Заключение..............................................................................................135 Глава 5. Программирование AVX – cкалярные вычисления с плавающей запятой.................................................................................137 5.1.Скалярнаяарифметикас плавающейзапятой......................................138 5.1.1.Арифметикас плавающейзапятойодинарнойточности..............138 5.1.1.Арифметикас плавающейзапятойдвойнойточности..................141 5.2.Скалярныесравненияи преобразованияс плавающейзапятой.........146 5.2.1.Сравнениес плавающейзапятой....................................................147 5.2.2.Преобразованиячиселс плавающейзапятой................................156 6 Оглавление
5.3.Скалярныемассивыи матрицыс плавающейзапятой........................163 5.3.1.Массивызначенийс плавающейзапятой.......................................163 5.3.2.Матрицызначенийс плавающейзапятой......................................167 5.4.Соглашениео вызовах.............................................................................171 5.4.1.Базовыефреймыстека.....................................................................172 5.4.2.Использованиесохраняемыхрегистровобщегоназначения....................................................................................176 5.4.3.ИспользованиесохраняемыхрегистровXMM................................181 5.4.4.Макросыдляпрологови эпилогов..................................................187 5.5.Заключение..............................................................................................194 Глава 6. Программирование AVX – упакованные числа с плавающей запятой.................................................................................196 6.1.Упакованнаяарифметикас плавающейзапятой..................................196 6.2.Сравнениеупакованныхчиселс плавающейзапятой..........................203 6.3.Преобразованияупакованныхчиселс плавающейзапятой................208 6.4.Массивыупакованныхчиселс плавающейзапятой.............................213 6.4.1.Квадратныекорниизупакованныхчиселс плавающейзапятой.....213 6.4.2.Поискминимальногои максимальногозначениймассиваупакованныхзначенийс плавающейзапятой.........................................217 6.4.3.Наименьшиеквадратыупакованныхчиселс плавающейзапятой.................................................................................222 6.5.Упакованныематрицызначенийс плавающейзапятой......................228 6.5.1.Транспонированиематрицы...........................................................229 6.5.2.Умножениематриц...........................................................................236 6.6.Заключение..............................................................................................242 Глава 7. Программирование AVX – упакованные целые числа........................................................................244 7.1.Сложениеи вычитаниеупакованныхцелыхчисел...............................244 7.2.Сдвигупакованныхцелыхчисел.............................................................250 7.3.Умножениеупакованныхцелыхчисел...................................................255 7.4.Обработкаизображенийс применениемупакованныхцелыхчисел..261 7.4.1.Минимальныеи максимальныезначенияпикселей......................262 7.4.2.Средняяинтенсивностьпикселей....................................................270 7.4.3.Преобразованияпикселей................................................................275 7.4.4.Гистограммыизображений..............................................................283 7.4.5.Пороговаяобработкаизображений.................................................290 7.5.Заключение...............................................................................................302 Глава 8. Подробнее про AVX2.................................................................304 8.1.СредавыполненияAVX2..........................................................................304 8.2.КомандыAVX2дляупакованныхчиселс плавающейзапятой............305 8.3.КомандыAVX2дляупакованныхцелыхчисел......................................307 7
8.4.РасширениянаборакомандX86.............................................................308 8.4.1.Числас плавающейзапятойполовиннойточности.......................308 8.4.2.Слитноеумножениесложение(FMA).............................................309 8.4.3.Расширениянаборакоманддлярегистровобщегоназначения.... 311 8.5.Заключение..............................................................................................312 Глава 9. Программирование AVX2 – упакованные числа с плавающей запятой.................................................................................314 9.1.Арифметикаупакованныхчиселс плавающейзапятой.......................315 9.2.Массивыупакованныхчиселс плавающейзапятой.............................321 9.2.1.Простыевычисления........................................................................321 9.2.2.Среднееарифметическоезначениестолбца..................................328 9.2.3.Коэффициенткорреляции................................................................334 9.3.Умножениеи транспонированиематриц..............................................341 9.4.Обращениематриц..................................................................................349 9.5.Командысмешиванияи перестановки..................................................361 9.6.Командыизвлеченияданных.................................................................367 9.7.Заключение...............................................................................................373 Глава 10. Программирование AVX2 – упакованные целые числа........................................................................375 10.1.Основныеоперациинадупакованнымицелымичислами................375 10.1.1.Основныеарифметическиеоперации..........................................376 10.1.2.Упаковкаи распаковка....................................................................380 10.1.3.Увеличениеразмера........................................................................386 10.2.Обработкаизображенийс упакованнымицелочисленнымипикселями........................................................................391 10.2.1.Усечениепикселей..........................................................................391 10.2.2.Поискминимальногои максимальногозначенийRGB...............396 10.2.3.ПреобразованиеRGBв оттенкисерого..........................................403 10.3.Заключение.............................................................................................411 Глава 11. Программирование AVX2 – расширенные команды.............................................................................412 11.1.ПрограммированиеоперацийFMA......................................................412 11.1.1.Свертки............................................................................................413 11.1.2.СкалярныеоперацииFMA..............................................................415 11.1.3.ОперацииFMAс упакованнымиоперандами..............................424 11.2.Командыдляработыс регистрамиобщегоназначения.....................431 11.2.1.Бесфлаговоеумножениеи сдвиги..................................................432 11.2.2.Расширенныеманипуляциибитами.............................................436 11.3.Преобразованияс плавающейзапятойполовиннойточности..........440 11.4.Заключение.............................................................................................443 8 Оглавление
Глава 12. Система векторных команд AVX-512...............................445 12.1.ОбзорAVX512........................................................................................445 12.2.СредавыполненияAVX512...................................................................446 12.2.1.Наборырегистров...........................................................................447 12.2.2.Типыданных....................................................................................448 12.2.3.Синтаксискоманды........................................................................448 12.3.Обзорнаборакоманд.............................................................................452 12.3.1.AVX512F...........................................................................................453 12.3.2.AVX512CD.........................................................................................455 12.3.3.AVX512BW........................................................................................456 12.3.4.AVX512DQ........................................................................................456 12.3.5.Регистрымаскиоперации..............................................................457 12.4.Заключение.............................................................................................458 Глава 13. Программирование AVX-512 – числа с плавающей запятой....................................................................459 13.1.Скалярныеоперандыс плавающейточкой.........................................459 13.1.1.Маскированиеслиянием................................................................460 13.1.2.Маскированиенулем......................................................................463 13.1.3.Округлениенауровнекоманды.....................................................466 13.2.Упакованныечислас плавающейзапятой...........................................470 13.2.1.Арифметикаупакованныхчиселс плавающейзапятой..............471 13.2.2.Сравнениеупакованныхчиселс плавающейзапятой.................478 13.2.3.Средниезначениястолбцаупакованныхчиселс плавающейзапятой.................................................................................483 13.2.4.Векторныеперекрестныепроизведения......................................491 13.2.5.Умножениематрицынавектор.....................................................501 13.2.6.Свертки............................................................................................512 13.3.Заключение.............................................................................................516 Глава 14. Программирование AVX-512 – упакованные целые числа........................................................................517 14.1.Базоваяарифметика..............................................................................517 14.2.Обработкаизображений........................................................................523 14.2.1.Пиксельныепреобразования.........................................................523 14.2.2.Пороговаяобработкаизображений...............................................530 14.2.3.Статистикаизображений...............................................................535 14.2.4.ПреобразованиеформатаRGBв оттенкисерого..........................546 14.3.Заключение.............................................................................................553 Глава 15. Стратегии и методы оптимизации.....................................555 15.1.Микроархитектурапроцессора.............................................................555 15.1.1.Обзорархитектурыпроцессора.....................................................556 9
15.1.2.Функциональнаясхемаконвейерамикроархитектуры...............557 15.1.3.Механизмвыполнения...................................................................560 15.2.Оптимизациякоданаязыкеассемблера..............................................561 15.2.1.Основныеметоды...........................................................................562 15.2.2.Операциис плавающейзапятой....................................................563 15.2.3.Ветвлениепрограммы....................................................................564 15.2.4.Выравниваниеданных....................................................................565 15.2.5.МетодыSIMD...................................................................................566 15.3.Заключение.............................................................................................567 Глава 16. Продвинутое программирование......................................568 16.1.КомандаCPUID.......................................................................................568 16.2.Постоянныехранилищав памяти........................................................584 16.3.Предварительнаявыборкаданных.......................................................589 16.4.Многопоточность...................................................................................596 16.5.Заключение.............................................................................................609 Приложение....................................................................................................611 П.1.Программныеутилитыдляпроцессоровx86........................................611 П.2.VisualStudio.............................................................................................611 П.2.1.Запускпримераисходногокода......................................................612 П.2.2.СозданиепроектаVisualStudioC ++...............................................612 П.3.Основныеи дополнительныематериалы.............................................620 П.3.1.СправочныеруководствапопрограммированиюнаX86.............620 П.3.2.Справочныематериалыпоx86и микроархитектуре....................621 П.3.3.Вспомогательныересурсы...............................................................622 П.3.4.Ссылкинаресурсыпоалгоритмам.................................................622 П.3.5.СсылкинаресурсыпоC ++..............................................................623 Предметный указатель..............................................................................624 10 Оглавление