Используя ваш пример вычисления как суммы, так и разницы, вероятно, будет достигнута лучшая производительность, если вы вычислите оба в одно и то же время (то есть в одном и том же ядре).
Предполагая, что это невозможнопо какой-то причине, тогда, если ваши массивы очень велики, тогда лучшая производительность может заключаться в том, чтобы использовать весь графический процессор (т.е. несколько мультипроцессоров) для вычисления результата, и в этом случае не так уж важно, что вы делаете один за другим.
Для обоих вышеперечисленных случаев я настоятельно рекомендую вам ознакомиться с образцом сокращение в SDK, который проведет вас через наивную реализацию до довольно быстрой версии с хорошей документацией.
Сказав все это, если объем работы достаточно маленький , что вы не будете полностью использовать весь графический процессор для одного из ваших вычислений, тогда есть два способа запустить разные вычисления на разных мультипроцессорах:
- Используйте «Параллельные ядра», где несколькоядра работают на одном и том же графическом процессоре одновременно.См. Руководство по программированию CUDA для получения дополнительной информации и ознакомьтесь с образцом concurrentKernels в SDK. По сути, вы вручную указываете планировщику, что между ними нет никакой зависимости (с помощью потоков CUDA), что позволяет затем бытьвыполняется одновременно.
- Установите переключатель blockIdx для выбора кода для выполнения.
Первый из них гораздо предпочтительнее, если ваше оборудование его поддерживает (вам потребуется Compute Capability2.0 или выше), поскольку читать и поддерживать его намного проще.