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

0

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

Итак, есть ядро

__global__ void complexStuff(...)

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

__device__ void interpolate(...)

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

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

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

Теги:
multithreading
parallel-processing
cuda
dynamic-parallelism

1 ответ

2
Лучший ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню