Параллельное выполнение потоков и функций хоста - PullRequest
0 голосов
/ 15 ноября 2018

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

loop {
AsyncCpy(....,HostToDevice,Stream1);
AsyncCpy(....,HostToDevice,Stream2);

Kernel<<<...,Stream1>>>
Kernel<<<...,Stream2>>>

/* Write the results on the host memory */
AsyncCpy(....,DeviceToHost,Stream1);  
AsyncCpy(....,DeviceToHost,Stream2);  
}

Я хочу поработать с процессором, как только узнаю, что StreamX завершил копирование результатов обратно в память хоста. В то же время я не хочу останавливать выполнение цикла асинхронными операциями (выполнение memcpy или ядра).

Если я вставлю свои функции хоста, скажем, host_ftn1 (..) и host_ftn2 (..) вот так

loop {
AsyncCpy(....,HostToDevice,Stream1);
AsyncCpy(....,HostToDevice,Stream2);

Kernel<<<...,Stream1>>>
Kernel<<<...,Stream2>>>

/* Write the results on the host memory to be processed by host_ftn1(..) */
AsyncCpy(....DeviceToHost,Stream1);
/* Write the results on the host memory to be processed by host_ftn2(..) */
AsyncCpy(....DeviceToHost,Stream2);  

if(Stream1 results are copied to host)
       host_ftn1(..);
if(Stream2 results are copied to host)
       host_ftn2(..);
}

Он остановит выполнение цикла до тех пор, пока не завершит выполнение функций хоста, то есть host_ftn1 и host_ftn2, но я не хочу останавливать выполнение инструкций GPU т.е. AsyncCpy (..) и Kernel <<< ...., StreamX >>> пока ЦП занят выполнением функций хоста, то есть host_ftn1 (..) и host_ftn2 (..)

Любое решение / подход в отношении этой проблемы

1 Ответ

0 голосов
/ 27 ноября 2018

Как и предполагал huseyin tugrul buyukisik , stream callback работал в этом сценарии. Я проверил это для двух потоков.

Окончательный дизайн выглядит следующим образом: -

loop {
AsyncCpy(....,HostToDevice,Stream1);
AsyncCpy(....,HostToDevice,Stream2);

Kernel<<<...,Stream1>>>
Kernel<<<...,Stream2>>>

/* Write the results on the host memory to be processed by host_ftn1(..) */
AsyncCpy(....DeviceToHost,Stream1);
/* Write the results on the host memory to be processed by host_ftn2(..) */
AsyncCpy(....DeviceToHost,Stream2);  

callback1(..);    // Work to be done on the host once stream1 completes
callback2(..);    // Work to be done on the host once stream2 completes
}

См. Потоковые обратные вызовы

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