Ещё предлагаю поигратся с таким вариантом:
void main(void) { const int wSize = 8; const int qSize = 2; color = texture( tex, frag_texcoord); int frag_x = int( gl_FragCoord.x) / wSize; int frag_y = int( gl_FragCoord.y) / wSize; if ( ( frag_x % qSize) == 0) { for ( int i = 0; i < 1000; i++) color *= texture( tex, frag_texcoord + dFdx( gl_FragCoord.xy)); } else if ( ( frag_y % qSize) == 0) { for ( int i = 0; i < 1000; i++) color *= texture( tex, frag_texcoord + dFdy( gl_FragCoord.xy)); } }
Меняя wSize и qSize от 2 до 8 можно сделать очень интересные выводы :)
bazhenovc
> Небольшой бенч. Рисуется
попробуй на том же
if( nDotL > 0.0 ) {
...
}bazhenovc
> Ну а что тогда означает фраза ", but each can be working on a separate
> wavefront."?
Ну как я понимаю, это как раз это и означает что каждый warp по16 тредов может выполнять инструкции из разных wavefront-ов.
Интересный шойдер щас поиграюсь))
FROL
> Ну как я понимаю, это как раз это и означает что каждый warp по16 тредов может выполнять инструкции из разных wavefront-ов.
Нет :) Каждый SIMD может выполнять инструкции из разных варпов. Посмотри на картинку, там для каждого SIMD - свой program counter
bazhenovc
> > Ну как я понимаю, это как раз это и означает что каждый warp по16 тредов может выполнять инструкции из разных wavefront-ов.
> Нет :) Каждый SIMD может выполнять инструкции из разных варпов. Посмотри на картинку, там для каждого SIMD - свой program counter
Оба предложения означают одно и то же. Т.к. 16 тредов выполняются на одном SIMD за 1 такт.
При этом говорится, что весь wavefront выполняется за 4 такта, но я нигде не нашел, что инструкция может меняться в течении этих 4х тактов.
При этом один wavefront никогда не разбивается между SIMD и у него один PC на все 64 треда.
Это означает, что 64 треда выполняются на одном SIMD "за раз". В случае с ALU операциями, на это требуется 4 такта. Доступ к памяти отдельная история.
Т.е. можно считать, что размер варпа у GCN 64 треда.
VirT
Ты путаешь SIMD с Compute Unit`ом, в GCN SIMD - 16 тредов, варп == 1 SIMD. CU == 4 SIMD.
Один wavefront может паралельно выполнятся на разных SIMD.
Процитирую один хороший обзор:
>Нагрузка для параллельного исполнения в SIMD-блок поступает в виде массива (wavefront) из 64 инструкций, который выполняется за четыре цикла. И хотя одновременно в работе могут быть только четыре массива, еще 28 находятся у Compute Unit в прямом доступе, за счет чего планировщик и получает пространство для маневра. В ситуации, когда зависимость в коде мешает комбинированному SIMD-блоку VLIW-процессора работать на полную мощность, отдельные SIMD-блоки чипа GCN просто переключатся на другие массивы из той же задачи либо вовсе на другие задачи
(c) 3D news
bazhenovc
> Ты путаешь SIMD с Compute Unit`ом, в GCN SIMD - 16 тредов, варп == 1 SIMD. CU == 4 SIMD.
Не путаю
> Один wavefront может паралельно выполнятся на разных SIMD.
Не может
VirT
> Не путаю
> Не может
Во всех пейперах, которые мне попадались, написано, что может.
Дай ссылку на пейпер, где написано, что не может :)
может ...
не может ...
сколько сможет, столько и сделает :)
bazhenovc
> Дай ссылку на пейпер, где написано, что не может :)
ответил в личку
bazhenovc
VirT
Вы лучше побольше не про железки, про практические примеры ...
innuendo
Ну внеси и ты полезную лепту, скажи как сделать много материалов в DS без бранчей :)
bazhenovc
При небольшом их разнообразии может помочь стенсил... При 3х разных материалах получаем 3и дипа на источник света.
Smouking
> ИМХО, что бы было где хранить тонны текстурок для нормальной картинки на 4к монике
Всё равно чтобы Crysis 3 шол без тормозов на трёх обычных Full HD мониках надо ставить SLI из трёх титанов :)
Тема в архиве.