Металл - Нитки и Нитевые группы
Я учусь 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
для
line 1
, Что представляют собой 3 целых числа? Я предполагаю назначить количество потоков, которые будут использоваться в процессе, но какой именно?Чем отличается
line 1
и "строка 2"? Мое предположение снова различается между потоками и группами потоков. Но я не уверен, в чем принципиальная разница и когда что использовать.
2 ответа
При отправке сетки рабочих элементов в вычислительное ядро вы обязаны разделить сетку на подмножества, называемые группами потоков, у каждого из которых общее число потоков (ширина * высота * глубина) меньше, чем maxTotalThreadsPerThreadgroup
соответствующего вычислительного состояния конвейера.
threadsPerThreadgroup
Размер указывает "форму" каждого подмножества сетки (то есть количество нитей в каждом измерении сетки). threadgroupsPerGrid
Параметр указывает, сколько групп потоков составляют всю сетку. Как и в вашем коде, часто это размеры текстуры, деленные на размеры выбранного вами размера группы потоков.
Одно замечание по производительности: каждое состояние конвейера вычислений имеет threadExecutionWidth
значение, которое указывает, сколько потоков в группе потоков будет запланировано и выполнено вместе с помощью графического процессора. Таким образом, оптимальный размер группы потоков всегда будет кратным threadExecutionWidth
, Во время разработки вполне приемлемо просто отправить небольшую квадратную сетку, как вы делаете сейчас.
Первая строка показывает количество потоков в группе (в данном случае двумерное 8x8), а вторая - количество групп в сетке. Затем функция dispatchThreadgroups(_:threadsPerThreadgroup:) в третьей строке использует эти два числа. Количество групп может быть опущено, в этом случае по умолчанию используется одна группа.