Вычислительные шейдеры Metal threadgroup и threadExecutionWidth

Может ли кто-нибудь объяснить простыми словами, что концептуально представляет группа потоков в вычислительных шейдерах Metal и другие термины, такие как группа SIMD, threadExecutionWidth (wavefront)? Я читал документы, но еще больше запутался. Например, если у меня есть изображение размером 1024x1024, сколько у меня может быть групп потоков, как я могу сопоставить потоки с каждым пикселем, сколько потоков может выполняться одновременно и т. д.? Я не могу найти видео WWDC с описанием вычислительных шейдеров и этих концепций.


person Deepak Sharma    schedule 30.04.2018    source источник


Ответы (1)


Группа потоков — это группа потоков, которые работают вместе для решения определенной (под)проблемы. В группе потоков может быть максимум 512 или 1024 потоков (в зависимости от используемого устройства).

threadExecutionWidth — это размер используемых групп SIMD. Обычно это 32, что означает, что в каждой группе SIMD есть 32 потоков. Для оптимальной производительности количество потоков в вашей группе потоков должно быть кратно threadExecutionWidth. (Это действительно то, что другие называют волновым фронтом или деформацией.)

Если у вас есть изображение 1024x1024 и вы хотите, чтобы один поток обрабатывал один пиксель, а максимальный размер группы потоков равен 512, вы можете создать сетку из 1024x1024 потоков, состоящую из 32x64 групп потоков размером 32x16 (т. е. 512).

Но на самом деле, вы можете разделить потоки, как хотите. У вас также может быть сетка из 2x1024 групп потоков размером 512x1 или что-то еще.

person Matthijs Hollemans    schedule 30.04.2018
comment
Вы не объяснили значение группы SIMD. Любое видео WWDC, освещающее эти темы? Кроме того, если maxTotalThreadsPerThreadGroup равен 512, а изображение имеет размер 1024x1024, можем ли мы с уверенностью предположить, что пиксели будут последовательно обрабатываться кусками по 512? Другими словами, следующая группа из 512 пикселей не будет обработана, пока не будут обработаны предыдущие 512 пикселей? - person Deepak Sharma; 30.04.2018
comment
Кроме того, как определить форму сетки — 1x512, 2x256 или 32x16 и т. д.? Я не могу найти какой-либо подробный учебник или видео WWDC, описывающее эти детали, если только кто-то не укажет мне. - person Deepak Sharma; 30.04.2018
comment
Аппаратное обеспечение графического процессора разделено на несколько групп SIMD. Если значение threadExecutionWidth равно 32, а значение maxThreadsPerThreadgroup равно 512, это означает, что в аппаратном обеспечении имеется 512/32=16 таких групп SIMD, и каждая из этих групп SIMD может запускать 32 потока одновременно. GPU решит, какую группу из 32 потоков запланировать в какой группе SIMD — как разработчик вы не можете это контролировать. Фактические детали аппаратного обеспечения Apple не публикует, поэтому то, как именно работает GPU, в основном остается догадками. - person Matthijs Hollemans; 30.04.2018
comment
Что касается того, можем ли мы с уверенностью предположить, что пиксели будут обрабатываться частями по 512 последовательно? Во-первых, вы как разработчик определяете, как выглядит эта сетка потоков и что должен делать каждый поток. Графическому процессору все равно, он просто запускает потоки, которые вы просили. Во-вторых, GPU может запускать эти потоки в любом порядке, но он всегда будет делать это в группах threadExecutionWidth, потому что он всегда должен запускать всю SIMD-группу за раз. Даже если вы используете 1 поток, он все равно запускает всю группу SIMD и просто отбрасывает результаты других 31 потока. - person Matthijs Hollemans; 30.04.2018