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

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

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

__global__ void complexStuff(...)

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

__device__ void interpolate(...)

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

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

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

1 ответ

Решение

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

Другие вопросы по тегам