Нитки и группы нитей в металле - PullRequest
1 голос
/ 26 мая 2019

У меня есть несколько вопросов относительно потоков по группам потоков и количества групп потоков.

  1. Поскольку у нас есть maxTotalThreadsPerThreadgroup и threadExecutionWidth, length * width * height группы потоков должно быть равнодо maxTotalThreadsPerThreadgroup.Итак, если у меня есть maxTotalThreadsPerThreadgroup = 1024 и threadExecutionWidth = 32, какая разница, если я создаю группу потоков размером (1024 * 1 * 1) или 32 * 32 * 1?Есть ли какая-то дополнительная выгода от общего времени выполнения графического процессора?Или это просто для более эффективного управления?

  2. Если я хочу запускать потоки больше чем maxTotalThreadsPerThreadgroup, тогда я создам несколько групп потоков.Можно ли предположить, что ThreadGroup1 будет выполнен до ThreadGroup2?

1 Ответ

1 голос
/ 26 мая 2019

Я не являюсь авторитетным источником по вычислениям в Metal, и многие детали, подобные этой, не документированы, поэтому рассмотрим следующее с небольшим количеством соли:

  1. Организация групп потоковв 1, 2 или 3 измерения - это удобство для вас как разработчика.Если ваша проблема трехмерная, используйте группы нитей с 3 измерениями.Если ваша проблема одномерна, используйте группы нитей с 1 измерением.Металлу на самом деле все равно.

  2. Не думаю, что вы можете предположить что-либо о порядке, в котором запланированы потоки GPU из ваших групп потоков.

Например, если вы запланировали 10 групп потоков, каждая из которых вычисляет промежуточный результат (например, сумму), то вам, вероятно, не следует зависеть от 10-й группы потоков, чтобы собрать эти результаты и объединить их в однуокончательный результат (итоговая сумма).Вместо этого вам нужно будет запустить новое вычислительное ядро, чтобы сделать это.

(Я был бы рад, если бы я ошибся в этом, но я нигде не читал, что Metal гарантирует подобные вещи.)

...