#cuda
#cuda
Вопрос:
Я читаю руководство по программированию на CUDA, которое я нахожу плотным. Я дошел до раздела, где объясняется, что родительская сетка может создавать дочернюю сетку, а родительская сетка считается завершенной только тогда, когда все ее дочерние потоки завершены.
Мой вопрос: насколько «глубоко» разрешено расти родительско-дочернему дереву в Cuda: ограничены ли они только вычислительными возможностями рассматриваемого оборудования, например, можно, например, создавать столько родительских / дочерних блоков потоков, сколько он / она хочет, при условии, что мы непревысить максимальное количество потоков, которые могут выполняться на оборудовании одновременно, или существуют дополнительные ограничения? Я спрашиваю об этом, потому что при отсутствии этой возможности я не вижу, как рекурсия может быть реализована на графических процессорах.
спасибо, Амин
Комментарии:
1. docs.nvidia.com/cuda/cuda-c-programming-guide/…
2. @RobertCrovella если максимальная глубина вложенности равна 24 в соответствии с документацией, и мы рассмотрим пример вызова ядра, которое работает с обеими половинами массива рекурсивным способом, в процессе разделяя размер на 2 в каждом порожденном дочернем ядре, то максимальный размер массива, который следует учитыватьравно 2 ^ 24?
3. Да, я думаю, что это правильно. Однако не означает ли это также, что вы (на последнем уровне вложенности) запускаете 2 ^ 24 ядра (или, может быть, его ‘2 ^ 23). Если это то, что вы имеете в виду: 1. Существуют и другие ограничения, с которыми вы можете столкнуться, например, ограничение ожидания запуска. 2 Вероятно, это будет плохой идеей с точки зрения производительности. Процесс запуска ядра имеет накладные расходы, и графический процессор не используется должным образом при запуске ядер с низким количеством потоков или блоков. Общий совет состоял бы в том, чтобы найти другой способ реализации алгоритма. По моему опыту, рекурсия на уровне ядра широко не используется.
4. @RobertCrovella это было просто теоретическое соображение, которое я имел в виду, поскольку это то, что мы считаем само собой разумеющимся в однопоточных приложениях с процессором. Вы правы, что на последнем уровне у нас есть 2 ^ 23 ядра, то есть потоки, но я предполагаю, что это выходит за рамки ограничений даже новейшего графического процессора?
5. Я думаю, вас может смутить, как графический процессор выполняет потоки. Например, в вашем вопросе вы указываете: «при условии, что мы не превышаем максимальное количество потоков, которые могут выполняться на оборудовании одновременно». Я не уверен, почему это было бы фактором здесь. Несмотря на это, 2 ^ 23 потока не выходят за рамки ограничений графических процессоров (даже самых старых графических процессоров), но попытка одновременного запуска 2 ^ 23 ядер, вероятно, неосуществима.
Ответ №1:
Мой вопрос: насколько «глубоко» разрешено расти родительско-дочернему дереву в Cuda
В документации указана максимальная глубина вложенности 24.
Как указано в документации, обычно существуют другие ограничения, которые вы можете достичь первыми, прежде чем фактически достичь глубины вложенности 24. Одним из них могут быть общие ограничения на запуск ядра устройства, включая требования к памяти, а также ограничения на ожидающий запуск. Другим возможным ограничением является ограничение синхронизации. Это связано с тем, явно ли родительское ядро ожидает завершения дочернего ядра (например, на стороне устройства cudaDeviceSynchronize()
) и на какую глубину расширена эта синхронизация.
при условии, что мы не превышаем максимальное количество потоков, которые могут выполняться на оборудовании одновременно
Ничто из этого явно не зависит от того, сколько потоков находится в родительском ядре или дочерних ядрах. Ядра CUDA не имеют каких-либо базовых ограничений на количество потоков, которые аппаратное обеспечение может запускать одновременно, как и динамический параллелизм CUDA (CDP).
С практической точки зрения запуск CDP с большой глубиной может столкнуться с множеством ограничений. Кроме того, такие шаблоны проектирования могут быть не самыми лучшими с точки зрения производительности. Запуск CDP сопряжен с затратами времени и ресурсов, и для любого шаблона, который разделил бы работу таким образом, в ядре CUDA обычно желательно выполнять больше работы в ядре, а не меньше.