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