Динамический параллелизм - запуск множества маленьких ядер идет очень медленно

Я пытаюсь использовать динамический параллелизм для улучшения алгоритма, который я имею в CUDA. В моем исходном решении CUDA каждый поток вычисляет число, общее для каждого блока. Я хочу сначала запустить грубое (или с низким разрешением) ядро, где потоки вычисляют общее значение только один раз (например, если каждый поток представляет один блок). Затем каждый поток создает небольшую сетку из 1 блока (потоки 16x16) и запускает для нее дочернее ядро, передавая общее значение. Теоретически это должно быть быстрее, потому что каждый сохраняет много избыточных операций. Но на практике решение работает очень медленно, я не знаю почему.

Это очень упрощенный код, просто идея.

__global__ coarse_kernel( parameters ){
    int common_val = compute_common_val();
    dim3 dimblock(16, 16, 1);
    dim3 dimgrid(1, 1, 1);
    child_kernel <<< dimgrid, dimblock >>> (common_val, parameters);

}

__global__ child_kernel( int common_val, parameters ){
    // use common value
    do_computations(common_val, parameters);
}

Количество child_kernels много, по одному на поток, и должно быть около 400x400 потоков. Из того, что я понимаю, GPU должен обрабатывать все эти ядра параллельно, верно?

Или дочерние ядра обрабатываются как-то последовательно?

Мои результаты показывают, что производительность более чем в 10 раз ниже, чем в исходном решении, которое я имел.

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

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