2014-12-23 6 views
0

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

Я вижу, что он блокирует выполнение, и мне интересно, как правильно его использовать. Должен ли cublasSetMatrixAsync быть в потоке, отличном от стандартного? Если это так, есть ли простой способ для потока по умолчанию блокировать, если в будущем ему понадобится матрица на устройстве для некоторого ядра?

+1

Не могли бы вы указать на соответствующие части документации NVIDIA, которые, по вашему мнению, находятся в конфликте? – njuffa

+0

Более или менее образованная догадка заключается в том, что она будет показывать то же поведение, что и обычные функции memopy CUDA, так как я уверен, что внутри функции CUBLAS просто используют обычные функции CUDA. Поведение последнего подробно объяснялось в http://developer.download.nvidia.com/compute/cuda/4_1/rel/toolkit/docs/online/sync_async.html (к сожалению, этот обзорный раздел, похоже, уже не содержащиеся в более поздних документах ...) – Marco13

+0

@njuffa Я смотрю на pg. 269 ​​в «Профессиональном программировании CUDA» Чэн, Гроссман и Мкерчер. Авторы говорят, что «Если вы хотите пересечь различные операции CUDA, вы должны использовать ненулевые потоки». но затем на этой странице предполагается, что cudaMemcpyAsync может использоваться с потоком по умолчанию. – user3487187

ответ

1

Да, у него есть блокировка.

От programming guide:

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

любая команда CUDA для потока по умолчанию,

cublasSetMatrixAsync не освобождается от этого.

Общее правило для параллелизма CUDA - если вы этого хотите, не используйте поток по умолчанию.

Есть ли простой способ для потока по умолчанию блокировать, если в будущем ему понадобится матрица на устройстве для некоторого ядра?

вопрос cudaDeviceSynchronize()

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

+0

Спасибо за это. Я предполагаю, что мой вариант использования немного сложнее, поскольку у меня есть несколько переносов устройств -> переносится устройство (скажем, матрицы A, B, C ...), а также вычисляется (opA, opB, opC ...). Я только хочу, чтобы opB ожидал, что матрица B, opC ждет матрицу C и т. Д. Есть ли способ согласовать вызовы синхронизации в потоке по умолчанию с передачей соответствующего узла -> устройства? – user3487187

+1

Не используйте поток по умолчанию. Если вы хотите, чтобы opB дождался матрицы B, затем выпустите opB в тот же поток, в который обрабатывается матрица B. Активность CUDA, выдаваемая данному потоку, всегда сериализуется. Если вы хотите, чтобы хост-операция дождалась операций устройства в данном потоке, вместо этого выпустите 'cudaStreamSynchronize()'. –