OpenCL: насколько легкими являются потоки GPU? - PullRequest
0 голосов
/ 09 декабря 2018

Я продолжаю читать, что потоки графического процессора облегчены, и вы можете добавить к ним много задач для параллельного выполнения ... но насколько они легки, точно?

Допустим, у меня есть миллион с плавающей точкой3массив, и я хочу рассчитать длину каждого значения float3.

Имеет ли смысл посылать по существу 1 миллион задач в графический процессор (поэтому ядро ​​вычисляет одну длину float3 глобального массива и возвращает)?Или что-то более 1000 задач, и каждое выполнение ядра проходит через 1000 членов массива?Если такая группировка задач выгодна, есть ли способ рассчитать оптимальный размер каждой группы?

1 Ответ

0 голосов
/ 15 декабря 2018

Если мы говорим только о графических процессорах, ответ - очень легкий.

Имеет ли смысл отправлять по существу 1 миллион задач в графический процессор

Вы не «отправляете миллион задач» в графический процессор.Вы отправляете один запрос длиной в несколько десятков байт, который, по сути, говорит: «Пожалуйста, запустите миллион копий этого кода с координатами сетки, которые я вам здесь предоставлю».Эти «копии» создаются на лету аппаратными средствами внутри графического процессора, и да, это очень эффективно.

1000 задач, и каждое выполнение ядра проходит через 1000 членов массива

На GPU вы почти наверняка не хотите этого делать.Современный высокопроизводительный GPU имеет более 4000+ процессорных блоков, поэтому вам нужно при минимальном таком количестве параллелизма.Но обычно намного выше.Существует планировщик, который выбирает один аппаратный поток для запуска на каждом из этих блоков обработки, и обычно на каждый блок обработки приходится несколько десятков аппаратных потоков.Так что нет ничего необычного в том, чтобы увидеть GPU с аппаратными потоками 100K +.Это необходимо для того, чтобы скрыть задержки памяти.

Так что, если вы запустите ядро ​​с размером сетки 1000x1, 3/4 вашего GPU может быть неиспользованным, а использованная часть будет тратить 90% времени на ожидание памяти,Идите и попробуйте.Графический процессор был разработан для обработки смешного количества потоков - не бойтесь их использовать.

Теперь, если вы говорите о процессоре, это немного другой вопрос.Процессоры, очевидно, не имеют 1000 аппаратных потоков.Здесь это зависит от реализации OpenCL - но я думаю, что наиболее разумные реализации OpenCL для ЦП сегодня справятся с этим, обрабатывая работу в циклах, в достаточном количестве аппаратных потоков для вашего ЦП.

TL; DR: useрешение "1 миллион задач", и, возможно, попробуйте настроить локальный размер работы.

...