Навіщо використовувати SIMD, якщо у нас є GPGPU?


13

Я подумав, що це питання краще подавати в CS частині Stack Exchange. Тепер, коли у нас є GPGPU з такими мовами, як CUDA та OpenCL, чи все-таки служать розширення для мультимедійних SIMD (SSE / AVX / NEON) цілі?

Нещодавно я прочитав статтю про те, як інструкції SSE можуть використовуватися для прискорення сортування мереж. Я подумав, що це досить охайно, але коли я сказав своєму професору арки комп, він засміявся і сказав, що запуск подібного коду на GPU знищить версію SIMD. Я не сумніваюся в цьому, оскільки SSE дуже простий, а графічні процесори - це великі складні прискорювачі з набагато більшим паралелізмом, але це задумалося, чи існує багато сценаріїв, де розширення мультимедійних SIMD є більш корисними, ніж використання GPU?

Якщо GPGPU робить SIMD надлишковим, чому Intel збільшує підтримку SIMD? SSE склав 128 біт, тепер це 256 біт з AVX, а наступного року це 512 біт. Якщо GPGPU краще обробляти код з паралелізмом даних, чому Intel висуває ці розширення SIMD? Вони, можливо, зможуть помістити еквівалентні ресурси (дослідження та область) у більший кеш-пам'ять та передбачувач гілок, покращуючи серійну продуктивність.

Навіщо використовувати SIMD замість GPGPU?


2
Саме по собі виклик годувати GPU достатньою кількістю даних, щоб тримати його зайнятим. Передача даних між хостом і пристроєм практично завжди є вузьким місцем. Деякі операції краще підтримуються на процесорах (наприклад, множення без переносу; див. PCLMULQDQ).
Juho

2
@Juho Чи не такі нові пристрої, як APU-версії AMD, мають графічний процесор і процесор однаково? Чи усуває це вузьке місце?
jonfrazen

1
Коли все сказано і зроблено, векторна інструкція все ще є однією інструкцією, а вартість її планування та виконання така ж, як і будь-яка інша інструкція. Запустити завдання на GPU має сенс лише тоді, коли користь перевищує вартість. Також врахуйте, що ви отримуєте один блок SIMD на ядро, але, як правило, лише один графічний процесор на шасі, і на даний момент GPU є загальним ресурсом. Це обмежує кількість завдань, які можна запустити на GPU. (Кількість ядер постійно збільшується, але кількість графічних процесорів - ні.)
Псевдонім

Intel не робить багато в плані графічних процесорів (окрім Larrabee / Knights Landing :)), тому я думаю, що для них цілком природно намагатися натиснути AVX. Незважаючи на те, що велике використання AVX може бути дуже ефективним, тепер це призводить до виходу з ладу своїх новіших процесорів, тому вони можуть щось бити в обмеження.
nsandersen

Відповіді:


16

Нічого не вільне. GPGPU - SIMD. Інструкції SIMD щодо GPGPU, як правило, ширші, ніж інструкції SIMD на процесорах. GPGPU, як правило, є дрібнозернистими багатопотоковими (і мають набагато більше апаратних контекстів, ніж процесори). GPGPU оптимізовані для потокового передавання . Вони, як правило, приділяють більший відсоток площі одиницям з плаваючою точкою, менший відсоток площі для кешування, і менший відсоток площі для цілої продуктивності.

Давайте зробимо порівняння. Ядро Intel i7-5960x має 8 ядер, кожне з 4-широким (подвійною точністю) SIMD, працює на 3 ГГц (3,5 ГГц турбо), кеш-пам'ять L3 20 М, споживає 356 мм ^ 2 і 140 Вт і коштує 1000 доларів. Так 8 * 4 * 3 * 4 = 384 подвійних точності GFlops. (Додатковий 4x - це тому, що ви можете робити два злиті-множувати-додавання на векторну смугу за цикл.) Це може зробити 768 одноточних GFlops. Це приблизно 1,08 DP GFlops / мм ^ 2 і 2,75 DP GFlops / Вт. Також є близько 57,5 ​​Кб / мм ^ 2 в кеш-пам'яті.

GeForce GTX Titan Black NVidia має 15 SMX, кожен з 32-дюймовою подвійною точністю SIMD, працює на частоті 890 МГц (980 МГц турбо), 3,5 М кеш-пам'яті L1 + L2, споживає 561 мм ^ 2, 250 Вт і коштує 1000 доларів. Так 15 * 32 * .89 * 4 = 1709 GFlops з подвійною точністю. (Те саме 4x з двох злитих-множих-додавань на векторну смугу за цикл.) Це може зробити 5126 одноточних GFlops. Це приблизно 3,05 DP GFlops / мм ^ 2 і 6,8 DP GFlops / Watt. Отже, 3x щільність плаваючої точки DP на одиницю площі та 3x ефективність потужності з плаваючою точкою DP. А компроміс? 6,4 КБ / мм ^ 2 кеш-пам'яті. Приблизно в 9 разів менш щільний, ніж процесор.

Отже, головна відмінність полягає в тому, що GPU обрав баланс площі, який сильно надає перевагу плаваючій точці (і особливо плаваючій точці з одною точністю) над кешем. Навіть ігноруючи той факт, що вам потрібно копіювати матеріали між процесором і графічним процесором, щоб зробити I / O, наскільки добре буде GPU робити порівняно з процесором, залежить від програми, яку ви виконуєте.

Якщо у вас є паралельна програма з плаваючою комою з дуже невеликою розбіжністю в управлінні (всі векторні смуги одночасно виконують те саме), і ваша програма потокова (не може отримати користь від кешування), то GPU збирається приблизно 3 рази ефективніше на одиницю площі або на ватт. Але якщо у вас є якась велика кількість розбіжних керуючих, не паралельних даних даних для виконання, або ви можете отримати користь від великих даних багато разів читати структури, процесор, ймовірно, зробить краще.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.