0

У меня есть уже распараллеленное ядро ​​CUDA, которое выполняет некоторые задачи, требующие частой интерполяции.Параллелизировать метод изнутри функции/ядра устройства CUDA

Так что есть ядро ​​

__global__ void complexStuff(...) 

, который вызывает один или несколько раз эту функцию интерполяции устройства:

__device__ void interpolate(...) 

алгоритм интерполяции делает Weno интерполяции последовательно по трем измерениям. Это очень параллелизуемая задача, которую я срочно хотел бы распараллелить!

Понятно, что ядро ​​complexStuff() можно легко распараллелить, вызвав его из кода хоста, используя синтаксис <<<...>>>. Также важно, что complexStuff() уже распараллелен.

Но мне непонятно, как распараллеливать что-то/создавать новые потоки изнутри функции устройства CUDA ... это даже возможно? Кто-нибудь знает?

ответ

2

Возможно, вы захотите рассмотреть динамический параллелизм (некоторые ресурсы here, here и here), чтобы вызвать ядро ​​CUDA из другого ядра CUDA. Это требует, чтобы ваша вычислительная способность устройства составляла 3,5 или выше. Он имеет ряд ограничений и ограничений, которые могут ухудшить производительность (упомянутый в 3-й ссылке).
Мое предложение вначале рассмотреть возможность вызова вашего ядра CUDA с complexStuff(...) количество работы, умноженное на interpolate(...) количество произведение. Другими словами, статически догадываться, что такое максимальная параллельная мелкозернистая Вакансии вам нужно сделать. Затем настройте ядро ​​для выполнения этих мелкозернистых заданий с потоками блоков. Обратите внимание, что это просто спекуляция, не зная ваш программный код.

Смежные вопросы