Kepler CUDA динамический параллелизм и дивергенция потоков

Существует очень мало информации о dynamic parallelism Кеплер, из описания этой новой технологии, означает ли это, что проблема расхождения потока управления потоком в той же основе решена?

Это позволяет recursion и получение ядра из кода устройства, означает ли это, что путь управления в другом потоке может выполняться одновременно?

3 ответа

Решение

Взгляните на эту статью

Динамический параллелизм, дивергенция потока и рекурсия - это отдельные понятия. Динамический параллелизм - это способность запускать потоки внутри потока. Это значит, например, вы можете сделать это

__global__ void t_father(...)   {
   ...
   t_child<<< BLOCKS, THREADS>>>();
   ...
}

Я лично исследовал в этой области, когда вы делаете что-то подобное, когда t_father запускает t_child, все ресурсы vga снова распределяются между ними, и t_father ждет, пока все t_child не закончили, прежде чем он сможет продолжаться (см. Также эту статью Слайд 25)

Начиная с Fermi, доступна рекурсия, которая позволяет потоку вызывать себя без переконфигурации другого потока / блока.

Что касается расхождения потоков, я думаю, мы никогда не увидим поток внутри деформации, выполняющий другой код одновременно...

Нет. Концепция деформации все еще существует. Все потоки в деформации - SIMD (одна команда, несколько данных), что означает, что они одновременно выполняют одну инструкцию. Даже когда вы вызываете дочернее ядро, графический процессор определяет один или несколько перекосов в вашем вызове. Помните о 3 вещах, когда вы используете динамический параллелизм:

  1. Самое глубокое, что вы можете сделать, это 24 (CC=3,5).

  2. Количество динамических ядер, работающих одновременно, ограничено (по умолчанию 4096), но может быть увеличено.

  3. Держите родительское ядро ​​занятым после вызова дочернего ядра, иначе есть большая вероятность того, что вы потратите ресурсы.

В презентации NVidia на слайде 9 приведен пример источника cuda.

__global__ void convolution(int x[])
{
   for j = 1 to x[blockIdx]
      kernel<<< ... >>>(blockIdx, j)
}

Далее будет показано, как часть управляющего кода CUDA перемещается в графический процессор, так что ядро ​​может порождать другие функции ядра в частичных доменных областях разных размеров (слайд 14).

Глобальный вычислительный домен и его разбиение по-прежнему статичны, поэтому вы не можете на самом деле перейти и изменить это вычисление DURING GPU, чтобы, например, вызывать больше исполнений ядра, потому что вы еще не достигли конца своей функции оценки. Вместо этого вы предоставляете массив, содержащий количество потоков, которые вы хотите создать с конкретным ядром.

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