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