Как выполнить дочернее ядро ​​256 раз одновременно в CUDA - PullRequest
1 голос
/ 09 апреля 2019

Я новичок в программировании CUDA, но мне нужно использовать его в сложном проекте.Мне действительно нужна помощь.

У меня вопрос: хочу ли я выполнить дочернее ядро ​​256 раз одновременно, что я могу сделать с динамическим параллелизмом?

Я читаю блог NVIDIA и там написано:

По умолчанию сетки, запускаемые в блоке потоков, выполняются последовательно: следующая сетка начинает выполняться только после завершения предыдущей.Это происходит, даже если сетки запускаются разными потоками внутри блока.

Итак, моя идея - установить размер блока (1,1) и размер сетки (256,1) для родительского ядра, и яможет запустить дочернее ядро ​​одновременно с 256 потоками в разных блоках.Это будет очень неэффективно?Какое решение лучше?

1 Ответ

2 голосов
/ 09 апреля 2019

Эта цитата продолжается с

Часто, однако, требуется больше параллелизма;как и при запуске ядра на стороне хоста, мы можем использовать потоки CUDA для достижения этой цели.Все потоки, созданные на устройстве, являются неблокирующими;то есть они не поддерживают неявную синхронизацию с потоком default NULL.Таким образом, последующее является единственным способом создания потока в коде устройства.

cudaStream_t s;
cudaStreamCreateWithFlags(&s, cudaStreamNonBlocking);

Затем использование другого (на стороне устройства) потока для каждого потока CUDA должно заставить их работать независимо вместо значения по умолчанию.one.

Кроме того, вы можете объединить несколько запусков в один большой запуск, используя некоторый алгоритм сокращения между родительскими потоками в родительском блоке.Увеличение общего числа потоков дочернего ядра и их отображение из идентификатора потока в проблемное пространство.Это должно решить проблему производительности небольших ядер в сочетании с максимальным числом одновременных выполнений ядра на устройстве (от 4 до 128 в зависимости от Cuda Compute Capability), поддерживаемым аппаратным обеспечением.

...