Навчитися ефективно використовувати SIMD команди сучасних процесорів при складанні програм
- Вивчити класифікацію обчислювальних систем згідно Flynn. Вивчити типи SIMD команд на сучасних процесорах (лекція 1, 2).
- Вивчити методи визначення системної інформації про процесори, яка необхідна для визначення можливості використання різних типів SIMD команд (таблиця 3.1).
Таблиця 3.1 Параметри функції __cpuid для отримання інформації про процесор
Функція (b) | Результат |
---|---|
0 | a [0] – максимальный номер звичайної функции; a [1], a [3], a [2] – тип процессора. Для Intel повинні отримати рядок “GenuineIntel” – оригінальний Intel, Для AMD повинні отримати рядок “AuthenticAMD”. |
1 | a [0] – додаткова інформація про тип процесора (тип, родина, модель,…); a [1] – Біти 8-15 – розмір рядка кешу в 8 – байтових елементах; Біти 16-23 – максимальна кількість ядер процесору; a [2] – Біт 0 – підтримка SSE3; a [2] – Біт 9 – підтримка SSSE3; a [2] – Біт 19 – підтримка SSE4.1; a [2] – Біт 20 – підтримка SSE4.2; a [2] – Біт 26 – підтримка AVX; a [2] – Біт 27 – підтримка AVX; a [2] – Біт 28 – підтримка AVX; a [3] – Біт 23 – підтримка MMX; a [3] – Біт 25 – підтримка SSE; a [3] – Біт 26 – підтримка SSE2; a [3] – Біт 28 – підтримка HYPER Threading; |
0x80000000 | a [3] – Біт 31 – підтримка 3DNow! (AMD); a [3] – Біт 30 – підтримка 3DNow!2 (AMD); |
0x80000001 | a [2] – Біт 6 – підтримка SSE4A; a [2] – Біт 11 – підтримка SSE5; |
0x80000002 - 0x80000004 | a [0], a [1], a [2], a [3] - повна назва процесора та його тактова частота (INTEL, AMD). |
-
Вивчити призначення типів даних __m128, __m256, __m128d, __m128i. Дані довжиною 128 біт оброблюються тільки SSE командами. __m128 – дані з плавачою крапкою звичайної точності; __m128d – дані з плавачою крапкою подвіййної точності; __m128i – цілі дані. Компоненти довжиною 8, 16, 32, 64 біта. Дані довжиною 256 біт оброблюються тільки AVX командами.
-
Навчитися використовувати SSE та AVX функції з використанням мови високого рівня (заголовний файл intrin.h і файли, які він підключає).
-
Скласти функції для визначення типу процесору, а також можливості використання SSE та AVX команд різного типу.
-
Скласти функції для обчислення: x[i] = |y[i]| + |z[i]| (i = 0.. n-1) для даних наступних типів без використання SIMD команд: (суми чичел за модулем)
- цілі довжиною 8 біт;
- цілі довжиною 16 біт;
- цілі довжиною 32 біт;
- цілі довжиною 64 біт;
- з плаваючою крапкою звичайної точності;
- з плаваючою крапкою подвійної точності.
-
Порівняти обчислювальну складність для цих функцій для довжини масиву 4096 *4096.
-
Результати виконання пунктів 2, 3 занести в таблицю.
-
Зробити висновки по ефективності використання SIMD команд для виконання арифметичних операцій.
-
Скласти функції для обчислення x[i] = √ (y[i]) (i = 0.. n-1) для даних з плаваючою крапкою звичайної та подвійної точності без використання та з використанням SIMD команд.
-
Порівняти обчислювальну складність для цих функцій для довжини масиву 4096.
-
Скласти функцію для обчислення x[i] = y[i] * z[i] з комплексними даними, компоненти яких дані типу float без та з використанням SIMD команд. Зробити висновки по ефективності.
-
(Вищий балл) Дослідити ефективність команд зрушення (SSE) для зрушення даних довжиною 512 біт на 1 біт.
- Код програми з функціями відповідно завданню.
- Таблиця зі значеннями обчислювальної складності для усіх функцій.
- Висновки по ефективності використання SIMD команд для виконання арифметичних операцій і обчислення √.
- Які типи обчислювальних систем згідно Flynn ви знаєте? До який типів відносяться сучасні процесори?
- Які недоліки мають MMX команди?
- Які недоліки мають 3DNow! команди?
- Які недоліки мають SSE команди?
- Вам треба обробляти дані типу __m128i. Яку перевірку необхідно обовязково виконати перед використанням команд для обробки даних цих типів?
- Як виділити пам'ять під масив довільної довжини таким чином, щоб можно було для цього масиву використовувати SSE команди?