Металл - Нитки и Нитевые группы

Я учусь Metal прямо сейчас и пытаюсь понять строки ниже:

let threadGroupCount = MTLSizeMake(8, 8, 1) ///line 1
let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1) ///line 2

command_encoder.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadGroupCount) ///line 3
  1. для line 1, Что представляют собой 3 целых числа? Я предполагаю назначить количество потоков, которые будут использоваться в процессе, но какой именно?

  2. Чем отличается line 1 и "строка 2"? Мое предположение снова различается между потоками и группами потоков. Но я не уверен, в чем принципиальная разница и когда что использовать.

2 ответа

Решение

При отправке сетки рабочих элементов в вычислительное ядро ​​вы обязаны разделить сетку на подмножества, называемые группами потоков, у каждого из которых общее число потоков (ширина * высота * глубина) меньше, чем maxTotalThreadsPerThreadgroup соответствующего вычислительного состояния конвейера.

threadsPerThreadgroup Размер указывает "форму" каждого подмножества сетки (то есть количество нитей в каждом измерении сетки). threadgroupsPerGrid Параметр указывает, сколько групп потоков составляют всю сетку. Как и в вашем коде, часто это размеры текстуры, деленные на размеры выбранного вами размера группы потоков.

Одно замечание по производительности: каждое состояние конвейера вычислений имеет threadExecutionWidth значение, которое указывает, сколько потоков в группе потоков будет запланировано и выполнено вместе с помощью графического процессора. Таким образом, оптимальный размер группы потоков всегда будет кратным threadExecutionWidth, Во время разработки вполне приемлемо просто отправить небольшую квадратную сетку, как вы делаете сейчас.

Первая строка показывает количество потоков в группе (в данном случае двумерное 8x8), а вторая - количество групп в сетке. Затем функция dispatchThreadgroups(_:threadsPerThreadgroup:) в третьей строке использует эти два числа. Количество групп может быть опущено, в этом случае по умолчанию используется одна группа.

Другие вопросы по тегам