Я написал программу, которая имеет два потока. Оба потока работают с некоторыми данными и записывают результаты обратно в память хоста.
Вот общая структура того, как я это делаю:
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 (..)
Любое решение / подход в отношении этой проблемы