Одновременное выполнение ядра CUDA с несколькими ядрами на поток

Использование разных потоков для ядер CUDA делает возможным параллельное выполнение ядра. Следовательноn ядра наn потоки теоретически могут работать одновременно, если они вписываются в аппаратное обеспечение, верно?

Теперь я сталкиваюсь со следующей проблемой:n отдельные ядра, ноn*m гдеm Ядра должны быть выполнены по порядку. Напримерn=2 а такжеm=3 приведет к следующей схеме выполнения с потоками:

Stream 1: <<<Kernel 0.1>>> <<<Kernel 1.1>>> <<<Kernel 2.1>>>
Stream 2: <<<Kernel 0.2>>> <<<Kernel 1.2>>> <<<Kernel 2.2>>>

Мое наивное предположение состоит в том, что ядра x.0 и y.1 должны работать одновременно (с теоретической точки зрения) или, по крайней мере, не последовательно (с практической точки зрения). Но мои измерения показывают, что это не так, и кажется, что выполняется последовательное выполнение (то есть K0.0, K1.0, K2.0, K0.1, K1.1, K2.1). Само ядро очень маленькое, поэтому параллельное выполнение не должно быть проблемой.

Теперь мой подход состоит в том, чтобы выполнить своего рода диспетчеризацию, чтобы убедиться, что ядра включены в чередующемся стиле в планировщик на GPU. Но при работе с большим количеством потоков / ядер это может принести больше вреда, чем пользы.

Хорошо, прямо к сути: каков будет подходящий (или, по крайней мере, другой) подход к решению этой ситуации?

Редактировать: Измерения выполняются с использованием событий CUDA. Я измерил время, необходимое для полного решения вычислений, т.е. е. GPU должен вычислить всеn * m Ядра. Предположение следующее: при полностью параллельном выполнении ядра время выполнения примерно (в идеале)1/n время, необходимое для выполнения всех ядер по порядку, при этом должно быть возможным одновременное выполнение двух или более ядер. Я гарантирую это, используя только два отдельных потока прямо сейчас.

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

Loop: i = 0 to m
    EnqueueKernel(Kernel i.1, Stream 1)
    EnqueueKernel(Kernel i.2, Stream 2)

против

Loop: i = 1 to n
    Loop: j = 0 to m
        EnqueueKernel(Kernel j.i, Stream i)

Последнее приводит к увеличению продолжительности работы.

Изменить № 2: Изменены номера потоков для начала на 1 (вместо 0, см. Комментарии ниже).

Редактировать № 3: Аппаратное обеспечение - NVIDIA Tesla M2090 (т. Е. Fermi, вычислительная мощность 2.0)

Ответы на вопрос(1)

Ваш ответ на вопрос