'

Advanced Vector Extensions (AVX) и их использование

Понравилась презентация – покажи это...





Слайд 0

Advanced Vector Extensions (AVX) и их использование Докладчик: Огородников Александр


Слайд 1

Расширения x86 2010. Набор команд AVX Количество инструкций >100. 32 нм


Слайд 2

Multi-Media Extensions (MMX) Впервые в процессорах Pentium MMX. Регистры: MM0 - MM7 (64 бита). Целочисленные вычисления.


Слайд 3

Streaming SIMD Extensions (SSE) Впервые в процессорах Pentium 3. Регистры: XMM0 - XMM7 (128 бит, 4 значения с плавающей точкой одинарной точности). Поддерживает вычисления с плавающей точкой.


Слайд 4

Streaming SIMD Extensions 2 (SSE2) Впервые в процессорах Pentium 4. Регистры: XMM0 - XMM7 (128 бит, 2 значения с плавающей точкой двойной точности). Включает в себя ряд команд управления кэшем для минимизации загрязнения кэша при обработке неопределенных потоков информации.


Слайд 5

Streaming SIMD Extensions 3 (SSE3) Впервые в процессорах Prescott. Регистры: XMM0 - XMM7 (128 бит, 2 значения с плавающей точкой двойной точности). Возможность горизонтальной работы с регистрами. Преобразования значений с плавающей точкой в целые.


Слайд 6

Supplemental Streaming SIMD Extension 3 (SSSE3) Впервые в процессорах Intel Core Microarchitecture. Регистры: XMM0 - XMM7 (128 бит, 2 значения с плавающей точкой двойной точности). Работа с упакованными целыми.


Слайд 7

Streaming SIMD Extensions 4 (SSE4) Впервые в процессорах Penryn. Регистры: XMM0 – XMM15 (128 бит, не работает с 64-битными MMX регистрами). Ускорение видео, обработка строк 8/16 битных символов.


Слайд 8

Advanced Vector Extensions (AVX) Регистры: YMM0 — YMM15 (256 бит): Неразрушающие операции: a = a + b => c = a + b


Слайд 9

Расшифровка инструкций ADDxx PD - Packed Double Precision Floating-Point Values PS - Packed Single Precision Floating-Point Values SD - Scalar Double Precision Floating-Point Values SS - Scalar Single Precision Floating-Point Values


Слайд 10

Расшифровка инструкций CVTxx2yy (Convert xx to yy Values) DQ - Packed Doubleword Integers SI - Doubleword Integers


Слайд 11

Неразрушающие операции SSE код: movdqa xmm2, xmm0 punpcklbw xmm0, xmm1 punpckhbw xmm2, xmm1 AVX код: vpunpckhbw xmm2, xmm0, xmm1 vpunpcklbw xmm0, xmm0, xmm1 v<команда SSE> dest, src1, src2


Слайд 12

Преимущества трехоперандных инструкций: Позволяют избавиться от лишних операций копирования регистров в коде. Упрощают написание хороших оптимизирующих компиляторов.


Слайд 13

Формат инструкций AVX ADDPD xmm1, xmm2/m128 VADDPD xmm1, xmm2, xmm3/m128 VADDPD ymm1, ymm2, ymm3/m256


Слайд 14

Новые инструкции: vbroadcastss / vbroadcastsd / vbroadcastf128 ; заполнение AVX регистра одним и тем же значением vmaskmovps / vmaskmovpd ; загрузка/сохранение AVX регистра по маске vzeroupper ; обнуление старших 128 бит всех AVX регистров vzeroall ;полное обнуление всех AVX регистров


Слайд 15

Новые инструкции: vinsertf128 / vextractf128 ; вставка/получение 128-битной части AVX регистра vperm2f128 ; перестановка 128-битных частей 256-битного AVX регистра vpermilps / vpermilpd ; перестановка float/double чисел в AVX регистре


Слайд 16

Новые инструкции: vldmxcsr / vstmxcsr ; загрузка/сохранение управляющих параметров AVX xsaveopt ; получение подсказки, какие регистры содержат данные


Слайд 17

Поддержка в операционных системах Windows 7 Windows Server 2008 R2 Linux с ядром 2.6.30 и выше


Слайд 18

Использование AVX в ассемблерном коде GAS - начиная с версии binutils 2.19.50.0.1 MASM - начиная с версии 10 (входит в Visual Studio 2010) NASM - начиная с версии 2.03 YASM - начиная с версии 0.70 AVX поддерживается всеми популярными ассемблерами для x86:


Слайд 19

Определение поддержки AVX системой Убедимся, что ОС сохраняет/восстанавливает контекст AVX с помощью инструкций XSAVE/XRSTOR: mov eax, 1 cpuid and ecx, 018000000h ; Проверяем, что установлены биты 27 (ОС использует XSAVE/XRSTOR) cmp ecx, 018000000h ; и 28 (поддержка AVX процессором)


Слайд 20

Определение поддержки AVX системой Инструкции XSAVE/XRSTOR конфигурируются с помощью extended control register (XCR0 - XFEATURE_ENABLED_MASK): xor ecx, ecx xgetbv ; значение XRC0 в edx:eax and eax, 110b cmp eax, 110b ; ОС сохраняет AVX регистры при переключении контекста


Слайд 21

Использование AVX-инструкций Нежелательно смешивать SSE- и AVX-инструкции. vzeroupper и vzeroall работают быстро. Команды загрузки/сохранения выровненных данных vmovaps/vmovapd/vmovdqa требуют, чтобы данные были выровнены на 16 байт. На Windows x64 подпрограмма не должна изменять регистры xmm6-xmm15. Ядро Sandy Bridge будет способно запускать на выполнение две 256-битные AVX-команды с плавающей точкой каждый такт. (одно умножение и одно сложение)


Слайд 22

Использование AVX-инструкций Пусть в функцию передали double a[4], double b[4]. Посчитаем a*b: mov eax, [esp + 8 + 0] ; eax = a mov edx, [esp + 8 + 8] ; edx = b vmovupd ymm0, [eax] ; ymm0 = *a vmovupd ymm1, [edx] ; ymm1 = *b vmulpd ymm0, ymm0, ymm1 ; ymm0 = ( a3 * b3, a2 * b2, a1 * b1, a0 * b0 )


Слайд 23

Использование AVX в коде на C/C++ Поддержка AVX реализована в следующих популярных компиляторах: Microsoft C/C++ Compiler - начиная с версии 16 (входит в Visual Studio 2010) Intel C++ Compiler - начиная с версии 11.1 GCC - начиная с версии 4.4 Для использования 256-битных инструкций AVX в дистрибутив включен заголовочный файл immintrin.h.


Слайд 24

Использование AVX в коде на C/C++ Чтобы проверить, что процессор поддерживает AVX: int isAvxSupportedByCpu() { int cpuInfo[4]; __cpuid( cpuInfo, 0 ); if( cpuInfo[0] != 0 ) { __cpuid( cpuInfo, 1 ); return cpuInfo[3] & 0x10000000; // Возвращаем ноль, если 28-ой бит в ecx сброшен } else { return 0; // Процессор не поддерживает получение информации о поддерживаемых наборах инструкций } }


Слайд 25

Использование AVX в коде на C/C++ Пусть в функцию передали double a[4], double b[4]. Посчитаем a*b: // mmA = a const __m256d mmA = _mm256_loadu_pd( a ); // mmB = b const __m256d mmB = _mm256_loadu_pd( b ); // mmAB = ( a3 * b3, a2 * b2, a1 * b1, a0 * b0 ) const __m256d mmAB = _mm256_mul_pd( mmA, mmB );


Слайд 26

Нормализация 3D-векторов Рассмотрим код: void Normalize(float Vec[][3],int N) { for (int i=0; i < N; ++i) { float *v=Vec[i]; float normal = 1.0f/sqrtf(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]); v[0] *= normal; v[1] *= normal; v[2] *= normal; } }


Слайд 27

Нормализация 3D-векторов Рассмотрим код: void Normalize(float Vec [ ] [3],int N) { for (int i=0; i < N; ++i) { float *v=Vec[i]; float normal = 1.0f/sqrtf(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]); v[0] *= normal; v[1] *= normal; v[2] *= normal; } } Array of Structures (AoS). Умножение может быть распараллелено, если рассматривать как Structure of Arrays (SoA).


Слайд 28

Нормализация 3D-векторов AVX позволяет делать параллельные вычисления с 8-ми float. Например, нормализовывать сразу 8 3D-векторов. Нам удобно работать с массивами, состоящими из координат 3D-векторов. Некоторые приложения требуют хранения 3D-векторов как массив структур.


Слайд 29

Нормализация 3D-векторов 128-bit AoS to SoA shuffle


Слайд 30

Нормализация 3D-векторов 128-bit AoS to SoA shuffle float *p; // адрес первого вектора __m128 x0y0z0x1 = _mm_load_ps(p+0); __m128 y1z1x2y2 = _mm_load_ps(p+4); __m128 z2x3y3z3 = _mm_load_ps(p+8); __m128 x2y2x3y3 = _mm_shuffle_ps(y1z1x2y2,z2x3y3z3,_MM_SHUFFLE( 2,1,3,2)); __m128 y0z0y1z1 = _mm_shuffle_ps(x0y0z0x1,y1z1x2y2,_MM_SHUFFLE( 1,0,2,1)); __m128 x = _mm_shuffle_ps(x0y0z0x1,x2y2x3y3,_MM_SHUFFLE( 2,0,3,0)); // x0x1x2x3 __m128 y = _mm_shuffle_ps(y0z0y1z1,x2y2x3y3,_MM_SHUFFLE( 3,1,2,0)); // y0y1y2y3 __m128 z = _mm_shuffle_ps(y0z0y1z1,z2x3y3z3,_MM_SHUFFLE( 3,0,3,1)); // z0z1z2z3


Слайд 31

Нормализация 3D-векторов 128-bit SoA to AoS shuffle


Слайд 32

Нормализация 3D-векторов 128-bit SoA to AoS shuffle __m128 x,y,z; // Начало данных SoA __m128 x0x2y0y2 = _mm_shuffle_ps(x,y, _MM_SHUFFLE(2,0,2,0)); __m128 y1y3z1z3 = _mm_shuffle_ps(y,z, _MM_SHUFFLE(3,1,3,1)); __m128 z0z2x1x3 = _mm_shuffle_ps(z,x, _MM_SHUFFLE(3,1,2,0)); __m128 rx0y0z0x1= _mm_shuffle_ps(x0x2y0y2,z0z2x1x3, _MM_SHUFFLE(2,0,2,0)); __m128 ry1z1x2y2= _mm_shuffle_ps(y1y3z1z3,x0x2y0y2, _MM_SHUFFLE(3,1,2,0)); __m128 rz2x3y3z3= _mm_shuffle_ps(z0z2x1x3,y1y3z1z3, _MM_SHUFFLE(3,1,3,1)); _mm_store_ps(p+0, rx0y0z0x1 ); _mm_store_ps(p+4, ry1z1x2y2 ); _mm_store_ps(p+8, rz2x3y3z3 );


Слайд 33

Нормализация 3D-векторов 256-bit AoS to SoA shuffle


Слайд 34

Нормализация 3D-векторов 256-bit AoS to SoA shuffle float *p; // адрес первого вектора __m128 *m = (__m128*) p; __m256 m03; __m256 m14; __m256 m25; m03 = _mm256_castps128_ps256(m[0]); // загрузка младших половин m14 = _mm256_castps128_ps256(m[1]); m25 = _mm256_castps128_ps256(m[2]); m03 = _mm256_insertf128_ps(m03 ,m[3],1); // загрузка старших половин m14 = _mm256_insertf128_ps(m14 ,m[4],1); m25 = _mm256_insertf128_ps(m25 ,m[5],1); __m256 xy = _mm256_shuffle_ps(m14, m25, _MM_SHUFFLE( 2,1,3,2)); __m256 yz = _mm256_shuffle_ps(m03, m14, _MM_SHUFFLE( 1,0,2,1)); __m256 x = _mm256_shuffle_ps(m03, xy , _MM_SHUFFLE( 2,0,3,0)); __m256 y = _mm256_shuffle_ps(yz , xy , _MM_SHUFFLE( 3,1,2,0)); __m256 z = _mm256_shuffle_ps(yz , m25, _MM_SHUFFLE( 3,0,3,1));


Слайд 35

Нормализация 3D-векторов 256-bit SoA to AoS shuffle __m256 x,y,z; // Начало данных SoA float *p; // указатель на данные AoS __m128 *m = (__m128*) p; __m256 rxy = _mm256_shuffle_ps(x,y, _MM_SHUFFLE(2,0,2,0)); __m256 ryz = _mm256_shuffle_ps(y,z, _MM_SHUFFLE(3,1,3,1)); __m256 rzx = _mm256_shuffle_ps(z,x, _MM_SHUFFLE(3,1,2,0)); __m256 r03 = _mm256_shuffle_ps(rxy, rzx, _MM_SHUFFLE(2,0,2,0)); __m256 r14 = _mm256_shuffle_ps(ryz, rxy, _MM_SHUFFLE(3,1,2,0)); __m256 r25 = _mm256_shuffle_ps(rzx, ryz, _MM_SHUFFLE(3,1,3,1)); m[0] = _mm256_castps256_ps128( r03 ); m[1] = _mm256_castps256_ps128( r14 ); m[2] = _mm256_castps256_ps128( r25 ); m[3] = _mm256_extractf128_ps( r03 ,1); m[4] = _mm256_extractf128_ps( r14 ,1); m[5] = _mm256_extractf128_ps( r25 ,1);


Слайд 36

Нормализация 3D-векторов Тест конвертации вектора AoS -> SoA -> Aos


Слайд 37

Нормализация 3D-векторов Тест нормализации вектора в SoA


Слайд 38

Нормализация 3D-векторов Тест нормализации вектора в SoA


Слайд 39

Шифрование AES Стандарт шифрования AES является официальным стандартом правительства США для симметричного шифрования. Инструкции AVXобеспечивают быстрое и безопасное шифрование и дешифрование с помощью алгоритма AES. AESENC, AESENCLAST, AESDEC, и AESDELAST обеспечивают высокопроизводительное шифрование и дешифрование. AESIMC и AESKEYGENASSIST, позволяют производить расширение ключа AES.


Слайд 40

Шифрование AES AES-128, AES-192, AES-256 обрабатывают блоки данных за соответственно 10, 12 или 14 итераций. Блок данных последовательно проходит через следующие стадии: над ним выполняется операция XOR первыми 128 битами ключа, на выходе получается “текущий” блок. Затем текущий блок проходит через 10/12/14 раундов шифрования, после которых он превращается в шифрованный (или дешифрованный) блок.


Слайд 41

Шифрование AES AddRoundKey (128-bit, 128-bit) является 128-битным преобразованием, которое заключается в побитовой операции XOR “текущего” блока и ключа итерации.


Слайд 42

Шифрование AES S-Box (Блок подстановки) это 8-битное преобразование, которое определяется как аффинная функция x -> A x-1 + b, где А – двоичная матрица 8х8, а b – 8-битный вектор: ()-1 - инверсия над полем Галуа


Слайд 43

Шифрование AES InvS-Box является обратным преобразованием по отношению к S-Box и определяется как у->(A y-1 + b)-1 ()-1 - инверсия над полем Галуа


Слайд 44

Шифрование AES SubBytes является 16-байтовым преобразованием, которое заключается в применении преобразования S-Box к каждому из 16 байтов на входе. InvSubBytes является 16-байтовым преобразованием, которое заключается в применении преобразования InvS-Box к каждому из 16 байтов на входе.


Слайд 45

Шифрование AES ShiftRows является побайтовой перестановкой: (15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) -> (11, 6, 1, 12, 7, 2, 13, 8, 3, 14, 9, 4, 15, 10, 5, 0). InvShiftRows является побайтовой перестановкой, обратной по отношению к ShiftRows: (15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) -> (3, 6, 9, 12, 15, 2, 5, 8, 11, 14, 1, 4, 7, 10, 13, 0).


Слайд 46

Шифрование AES MixColumns является 128-битным преобразованием, работающим со столбцами матрицы 4х4 байта, имеющейся на входе. Каждый столбец матрицы “текущего” блока умножается на полином a(x) = {03}x3 + {01}x2 + {01}x + {02} по модулю x4 + 1.


Слайд 47

Шифрование AES Инструкции AESENC, AESENCLAST, AESDEC, AESDECLAST можно описать приведенным ниже псевдо-кодом. Эти инструкции выполняют набор групповых преобразований, который соответствует потокам шифрования и дешифрования AES. AESENC xmm1, xmm2/m128 Tmp := xmm1; Round Key := xmm2/m128; Tmp := ShiftRows (Tmp); Tmp := SubBytes (Tmp); Tmp := MixColumns (Tmp); xmm1 := Tmp xor Round Key AESENCLAST xmm1, xmm2/m128 Tmp := xmm1; Round Key := xmm2/m128; Tmp := Shift Rows (Tmp); Tmp := SubBytes (Tmp); xmm1 := Tmp xor Round Key


Слайд 48

Шифрование AES Инструкции AESENC, AESENCLAST, AESDEC, AESDECLAST можно описать приведенным ниже псевдо-кодом. Эти инструкции выполняют набор групповых преобразований, который соответствует потокам шифрования и дешифрования AES. AESDEC xmm1, xmm2/m128; Tmp := xmm1; Round Key := xmm2/m128; Tmp := InvShift Rows (Tmp); Tmp := InvSubBytes (Tmp); Tmp := InvMix Columns (Tmp); xmm1 := Tmp xor Round Key AESDECLAST xmm1, xmm2/m128 State := xmm1; Round Key := xmm2/m128; Tmp := InvShift Rows (State); Tmp := InvSubBytes (Tmp); xmm1 := Tmp xor Round Key


Слайд 49

Шифрование AES Пример шифрования AES-128: ; данные в xmm1. регистры xmm2 – xmm12 содежат ключи раундов. ; По завершении xmm1 содержит результат шифрования pxor xmm1, xmm2 ; Round 0 (Round 0) aesenc xmm1, xmm3 ; Round 1 aesenc xmm1, xmm4 ; Round 2 aesenc xmm1, xmm5 ; Round 3 aesenc xmm1, xmm6 ; Round 4 aesenc xmm1, xmm7 ; Round 5 aesenc xmm1, xmm8 ; Round 6 aesenc xmm1, xmm9 ; Round 7 aesenc xmm1, xmm10 ; Round 8 aesenc xmm1, xmm11 ; Round 9 aesenclast xmm1, xmm12 ; Round 10


Слайд 50

Шифрование AES Пример шифрования AES-128 (параллельная обработка): mov ecx, 9 main_loop: add rdx, 0x10 movdqu xmm1, OWORD PTR [rdx] ; Загружаем ключ aesenc xmm2, xmm1 ; Шифрование aesenc xmm3, xmm1 ; aesenc xmm4, xmm1 ; aesenc xmm5, xmm1 ; aesenc xmm6, xmm1 ; aesenc xmm7, xmm1 ; aesenc xmm8, xmm1 ; aesenc xmm9, xmm1 ; loop main_loop . . . . . . . . . . . . . . . . .


Слайд 51

Шифрование AES Пример шифрования AES-128 (параллельная обработка): movdqu xmm1, OWORD PTR [rdx] ; Загружаем ключ aesenclast xmm2, xmm1 ; Последний раунд aesenclast xmm3, xmm1 ; aesenclast xmm4, xmm1 ; aesenclast xmm5, xmm1 ; aesenclast xmm6, xmm1 ; aesenclast xmm7, xmm1 ; aesenclast xmm8, xmm1 ; aesenclast xmm9, xmm1 ;


Слайд 52

Заключение Наборы векторных данных большей разрядности могут обрабатываться со скоростью до двух раз быстрее, чем 128-битные наборы данных. Новый набор команд Intel AVX может использоваться любыми приложениями, в которых значительная доля вычислений приходится на операции SIMD. Наибольший прирост производительности новая технология даст для тех из них, которые преимущественно выполняют вычисления с плавающей запятой и могут быть распараллелены (программы обработки звука и аудио-кодеки, программы для редактирования изображений и видео, приложения для моделирования и финансового анализа, промышленные и инженерные приложения).


Слайд 53

Ссылки http://software.intel.com/en-us/avx/ http://ru.wikipedia.org/wiki/AVX/


×

HTML:





Ссылка: