2016-02-14 6 views
3

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

ответ

5

Нет необходимости использовать потоки не по умолчанию для каждого устройства для одновременного выполнения ядер на нескольких устройствах из одного и того же хост-процесса или потока. Запуски ядра асинхронны и неблокируются, поэтому жесткий цикл с запуском ядра на отдельных устройствах должен приводить к перекрытию выполнения для нетривиальных ядер (помните, что переключение контекста устройства имеет латентность).

Это является необходимо использовать асинхронные версии всех других хост-API вызовы, как правило, используют в сочетании с ядром в потоке по умолчанию, потому что многие из них (семьи cudaMemcpy, например) блок.

+2

В качестве другой точки отсчета потоки и события являются [специфичными для устройства] (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#stream-and-event-behavior) так или иначе. Поэтому, если вы используете явно определенные потоки, вы * должны * использовать другой поток при переключении на другое устройство. И неявно, есть отдельный поток по умолчанию для каждого устройства. –