Skip to content

Semptra/ParallelProgramming_Lab_3

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 

Repository files navigation

Використання SIMD команд при розробці програм

Мета роботи

Навчитися ефективно використовувати SIMD команди сучасних процесорів при складанні програм

Підготовка до роботи

  1. Вивчити класифікацію обчислювальних систем згідно Flynn. Вивчити типи SIMD команд на сучасних процесорах (лекція 1, 2).
  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).
  1. Вивчити призначення типів даних __m128, __m256, __m128d, __m128i. Дані довжиною 128 біт оброблюються тільки SSE командами. __m128 – дані з плавачою крапкою звичайної точності; __m128d – дані з плавачою крапкою подвіййної точності; __m128i – цілі дані. Компоненти довжиною 8, 16, 32, 64 біта. Дані довжиною 256 біт оброблюються тільки AVX командами.

  2. Навчитися використовувати SSE та AVX функції з використанням мови високого рівня (заголовний файл intrin.h і файли, які він підключає).

Порядок виконання лабораторної роботи

  1. Скласти функції для визначення типу процесору, а також можливості використання SSE та AVX команд різного типу.

  2. Скласти функції для обчислення: x[i] = |y[i]| + |z[i]| (i = 0.. n-1) для даних наступних типів без використання SIMD команд: (суми чичел за модулем)

    • цілі довжиною 8 біт;
    • цілі довжиною 16 біт;
    • цілі довжиною 32 біт;
    • цілі довжиною 64 біт;
    • з плаваючою крапкою звичайної точності;
    • з плаваючою крапкою подвійної точності.
  3. Порівняти обчислювальну складність для цих функцій для довжини масиву 4096 *4096.

  4. Результати виконання пунктів 2, 3 занести в таблицю.

  5. Зробити висновки по ефективності використання SIMD команд для виконання арифметичних операцій.

  6. Скласти функції для обчислення x[i] = √ (y[i]) (i = 0.. n-1) для даних з плаваючою крапкою звичайної та подвійної точності без використання та з використанням SIMD команд.

  7. Порівняти обчислювальну складність для цих функцій для довжини масиву 4096.

  8. Скласти функцію для обчислення x[i] = y[i] * z[i] з комплексними даними, компоненти яких дані типу float без та з використанням SIMD команд. Зробити висновки по ефективності.

  9. (Вищий балл) Дослідити ефективність команд зрушення (SSE) для зрушення даних довжиною 512 біт на 1 біт.

Зміст звіту

  1. Код програми з функціями відповідно завданню.
  2. Таблиця зі значеннями обчислювальної складності для усіх функцій.
  3. Висновки по ефективності використання SIMD команд для виконання арифметичних операцій і обчислення √.

Контрольні запитання і завдання

  1. Які типи обчислювальних систем згідно Flynn ви знаєте? До який типів відносяться сучасні процесори?
  2. Які недоліки мають MMX команди?
  3. Які недоліки мають 3DNow! команди?
  4. Які недоліки мають SSE команди?
  5. Вам треба обробляти дані типу __m128i. Яку перевірку необхідно обовязково виконати перед використанням команд для обробки даних цих типів?
  6. Як виділити пам'ять під масив довільної довжини таким чином, щоб можно було для цього масиву використовувати SSE команди?

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages