"Я читав, що автомобілі F1 швидші, ніж ті, якими ми їздимо на вулицях ... чому люди тоді не користуються автомобілями F1?" Ну ... Відповідь на це питання проста: автомобілі F1 не можуть зламатися або повертатися так швидко, як це робить більшість автомобілів (найповільніша машина в цьому випадку може обіграти F1). Випадок графічних процесорів дуже схожий, вони гарні при дотриманні прямої лінії обробки, але вони не такі гарні, коли справа стосується вибору різних шляхів обробки.
Програма, виконана в GPU, має сенс, коли вона повинна виконуватися багато разів паралельно, наприклад, коли вам потрібно змішати всі пікселі з текстури A з пікселями з Texture B і помістити їх у Texture C. Це завдання при виконанні в процесор, оброблятиметься приблизно так:
for( int i =0; i< nPixelCount; i++ )
TexC[i] = TexA[i] + TexB[i];
Але це повільно, коли вам доводиться обробляти багато пікселів, тому GPU замість коду, описаного вище, просто використовує наступний:
TexC[i] = TexA[i] + TexB[i];
а потім він заповнює всі ядра з цією програмою (по суті, копіюючи програму в ядро), призначаючи значення i
для кожного. Тоді, звідки випливає магія від графічного процесора і змушує всі ядра виконувати програму одночасно , роблячи багато операцій набагато швидше, ніж це могло зробити лінійна програма процесора.
Такий спосіб роботи нормальний, коли ви повинні таким же чином обробити дуже багато невеликих входів, але насправді погано, коли вам доведеться скласти програму, яка може мати умовне розгалуження. Тож тепер давайте подивимось, що робить процесор, коли йдеться про деяку перевірку стану:
- 1: Виконай програму до першої логічної операції
- 2: Оцініть
- 3: Продовжуйте виконувати з адреси адреси пам'яті порівняння (як з інструкцією JNM asm)
Це дуже швидко для процесора як встановлення індексу, але для GPU зробити те саме, це набагато складніше. Оскільки живлення від GPU надходить одночасно з виконання тієї ж інструкції (вони є ядрами SIMD), вони повинні бути синхронізовані, щоб мати можливість скористатися архітектурою чіпа. Необхідність підготувати GPU до роботи з філіями передбачає більш-менш:
- 1: Створіть версію програми, яка слідує лише за гілкою A, заповніть цей код у всіх ядрах.
- 2: Виконати програму до першої логічної операції
- 3: Оцініть всі елементи
- 4: Продовжуйте обробку всіх елементів, які слідують за гілкою A, запускайте всі процеси, які обрали шлях B (для якого в ядрі немає програми!). Тепер усі ті сердечники, які обрали шлях B, будуть ІДЕЛЬНІ !!
- 5: Після завершення обробки активуйте версію програми B (відкопіюючи її з буферів пам'яті до невеликої основної пам'яті).
- 6: Виконати гілку B.
- 7: Якщо потрібно, змішайте / об'єднайте обидва результати.
Цей метод може відрізнятися залежно від багатьох речей (тобто деяких дуже малихгілки можуть працювати без необхідності цього розрізнення), але тепер ви вже можете зрозуміти, чому розгалуження буде проблемою. Кеші GPU дуже малі, ви не можете просто виконати програму з VRAM лінійним способом, вона повинна копіювати невеликі блоки інструкцій до ядер, які потрібно виконати, і якщо у вас є достатньо гілок, ваш GPU буде здебільшого зупинений, ніж виконувати. будь-який код, який не має сенсу, коли він виникає при виконанні програми, яка слідує лише за однією гілкою, як це робить більшість програм - навіть якщо вони працюють у декількох потоках. Порівняно з прикладом F1, це було б як відкрити гальмівні парашути у кожному куті, а потім вийти з машини, щоб упакувати їх назад всередині автомобіля до наступного кута, де ви хочете повернути знову або знайти червоний семафор (наступний кут ймовірно).
Тоді, звичайно, виникає проблема того, що інші архітектури настільки добре підходять до завдання логічних операцій, набагато дешевші та надійніші, стандартизовані, більш відомі, енергоефективні тощо. Новіші відеокарти навряд чи сумісні зі старими без емуляції програмного забезпечення, вони використовувати різні вказівки щодо ASM, навіть будучи від одного і того ж виробника, і що на даний момент більшість комп'ютерних програм не потребують цього типу паралельної архітектури, і навіть якщо вони їм потрібні, вони можуть використовувати стандартні apis, такі як OpenCL як згаданий електронним бізнесом, або через графічну апсис. Ймовірно, через кілька десятиліть у нас з'являться графічні процесори, які можуть замінити процесори, але я не думаю, що це станеться незабаром.
Я рекомендую документацію з програми AMD, яка багато пояснює їх архітектуру графічного процесора, а також я бачила про NVIDIA в посібниках CUDA, що дуже допомогло мені зрозуміти це. Я все ще не розумію деяких речей, і я можу помилитися, напевно, хтось, хто знає більше, може або підтвердити, або спростувати мої заяви, що було б чудово для всіх нас.