У меня есть уже распараллеленное ядро CUDA, которое выполняет некоторые задачи, требующие частой интерполяции.
Итак, есть ядро
__global__ void complexStuff(...)
который вызывает одно или несколько раз эту функцию интерполяционного устройства:
__device__ void interpolate(...)
Алгоритм интерполяции последовательно выполняет интерполяцию WENO в трех измерениях. Это очень параллелизуемая задача, которую я срочно хотел бы распараллелить!
Понятно, что ядро complexStuff()
можно легко распараллелить, вызвав его из кода хоста, используя синтаксис <<<...>>>
. Также важно, что complexStuff()
уже распараллелен.
Но мне непонятно, как распараллеливать что-то/создавать новые потоки изнутри функции устройства CUDA... это даже возможно? Кто-нибудь знает?
Возможно, вам стоит рассмотреть динамический параллелизм (некоторые ресурсы здесь, здесь и здесь), чтобы вызвать ядро CUDA из другого ядра CUDA. Это требует, чтобы ваша вычислительная способность устройства составляла 3,5 или выше. Он имеет ряд ограничений и ограничений, которые могут ухудшить производительность (упомянутый в 3-й ссылке).
Мое предложение - сначала рассмотреть возможность вызова вашего ядра CUDA с помощью complexStuff(...)
количества работы, умноженной на interpolate(...)
. Другими словами, статически догадывайтесь, каковы максимальные параллельные мелкозернистые задания, которые вам нужно сделать. Затем настройте свое ядро для выполнения этих мелкозернистых заданий с потоками блоков. Обратите внимание, что это просто спекуляция, не зная ваш программный код.