Вплив циклів змінної довжини на шейдери GPU


9

Популярним є візуалізація процедурного вмісту всередині GPU, наприклад, в демонстрації (малювання одного квадратика для заповнення екрана і надання можливості GPU обчислювати пікселі).

Рей марширує популярно:

введіть тут опис зображення

Це означає, що GPU виконує деяку невідому кількість ітерацій циклу на піксель (хоча ви можете мати верхню межу, як maxIterations).

Як впливає цикл змінної довжини на продуктивність шейдера?

Уявіть простий псуедокод, що марширує променями:

t = 0.f;
while(t < maxDist) {
    p = rayStart + rayDir * t;
    d = DistanceFunc(p);
    t += d;
    if(d < epsilon) {
       ... emit p
       return;
    }
}

Як впливають різні сімейства GPU (Nvidia, ATI, PowerVR, Mali, Intel тощо)? Вершинні шейдери, але особливо фрагменти шейдери?

Як це можна оптимізувати?


На жаль, тут дуже важко відповісти на це питання. Хоча одна відповідь вже дала вказівку на таке джерело, яке варто прочитати (передбачає динамічне розгалуження). +1 для "теми" ..
теодрон

1
@teodron не будь пораженим! Я сподівався, що хтось скаже, що на картках NVidia пікселі екрану в 8x8 блоках будуть ітератувати настільки глибоко, наскільки це найглибше, і що блоки розміром 8x8 пікселів можна робити в будь-якому порядку, або щось подібне; це неправда, це лише та мудрість, якою я сподіваюся, що люди зможуть поділитися. Посилання на Ларрабі, хм, досить непрямі.
Буде

Здається, він не обговорює "Ларрабі", але хлопець зі Стенфорда проговорив те ж саме через два роки після, у 2010 році ( ви можете побачити тут ). З його фігур, розглядаючи цикл часу, я не розумів, чи пікселі, які раніше закінчують свої обчислення, компенсують будь-яку продуктивність. У CUDA нитки чекають на бар’єрі. За аналогією, що відбувається з шейдерними нитками?
теодрон

@teodron так, я зрозумів CUDA і звернувся до GPU; Я впевнений, що вони перебувають у фіксаторі, але я хотів би, щоб хтось знаючий звучав; все одно, ось щось пов’язане williamedwardscoder.tumblr.com/post/26628848007/rod-marching
буде

Відповіді:


8

На GDC 2012 пройшла хороша розмова про дистанційне поле проходження GPU (та інші теми): http://directtovideo.wordpress.com/2012/03/15/get-my-slides-from-gdc2012/

Що стосується продуктивності, то новітні графічні карти (клас DX11) виконують шейдери на SIMD-одиницях, які виконують 32 (NVIDIA) або 64 (AMD) "потоки" в режимі блокування. Ці групи по-різному відомі як основи або хвилясті фронти. Для піксельних шейдерів кожен потік дорівнює одному пікселю, тому я б очікував, що блок SIMD обробляє щось подібне до блоку 8x4 (NVIDIA) або 8x8 (AMD) пікселів разом. Розгалуження та контроль потоку здійснюються за фронтовим фронтом, тому всі потоки на хвилі фронту повинні циклічити стільки разів, скільки найглибший окремий піксель у цій хвилі. Маски SIMD-смуги відключать виконання пікселів, які вже закінчились, але вони все одно повинні мовчки йти разом із загальним контролем потоку хвилі. Це, звичайно, означає, що система набагато ефективніша, коли розгалуження є когерентним,

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



0

Що стосується динамічного розгалуження, ще одна додаткова примітка (може бути очевидною, але все-таки варто відзначити деяким людям): вона може сильно вплинути на продуктивність розкручених циклів (ви, очевидно, не можете розкрутити цикл, якщо є незмінна кількість ітерацій) .


-4

int s = 0;

тепер для (int k = 1; k <= n; k ++) {s + = k;} те саме, що s = n * (n + 1) / 2

так що це взагалі не вірно: D


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