Распараллелить метод изнутри функции / ядра устройства CUDA

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

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

__global__ void complexStuff(...)

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

__device__ void interpolate(...)

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

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

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

0

Решение

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector