Нарушение производительности при вызове ядра cuda - PullRequest
9 голосов
/ 19 февраля 2012

Мне интересно, каковы издержки выполнения вызова ядра cuda в C / C ++, например:

somekernel1<<<blocks,threads>>>(args);
somekernel2<<<blocks,threads>>>(args);
somekernel3<<<blocks,threads>>>(args);

Причина, по которой я спрашиваю об этом, заключается в том, что приложение, которое я сейчас создаю, выполняет повторные вызовы в несколько ядер (без перечитывания / записи памяти между устройствами между вызовами), и мне интересно, переносит ли эти вызовы ядра в один вызов ядра (когда somekernel1-3 становится функциями устройства) может привести к значительным изменениям в производительности.

Ответы [ 2 ]

13 голосов
/ 19 февраля 2012

Издержки на стороне хоста при запуске ядра с использованием API времени выполнения составляют всего 15-30 микросекунд на платформах Windows без WDDM.На платформах WDDM (которые я не использую) я понимаю, что это может быть намного, намного выше, плюс в драйвере есть какой-то механизм пакетной обработки, который пытается амортизировать стоимость, выполняя несколько операций в одной операции на стороне драйвера.

Как правило, произойдет увеличение производительности при «объединении» нескольких операций с данными, которые в противном случае выполнялись бы в отдельных ядрах в одно ядро, где это допускают алгоритмы.GPU имеет намного более высокую арифметическую пиковую производительность, чем пиковая пропускная способность памяти, поэтому, чем больше FLOP может быть выполнено для каждой транзакции памяти (и для "кода установки" ядра), тем выше будет производительность ядра.С другой стороны, попытка написать ядро ​​в стиле «швейцарского армейского ножа», которое пытается втиснуть совершенно разрозненные операции в один кусок кода, никогда не будет особенно хорошей идеей, потому что это увеличивает давление в регистре и снижает эффективность таких вещей, как L1постоянная память и кэши текстур.

Какой путь вы выберете, должен действительно руководствоваться природой кода / алгоритмов.Я не верю, что есть один «правильный» ответ на этот вопрос, который можно применять при любых обстоятельствах.

1 голос
/ 19 февраля 2012

Если вы используете Visual Studio Pro в Windows, я полагаю, что вы запускаете тестовое приложение с помощью NVidia Parallel NSight, я думаю, что оно может подсказать вам метки времени от вызова метода до реального выполнения, в любом случае присущи штрафы, но это будет незначительным, если ваше ядро ​​прослужит долго.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...