Как наполнить движок TensorRT данными потоковой передачи в реальном времени
Из документации TensorRT и примера кода я вижу, что общий шаблон - запуск движка и данных в следующей последовательности ( здесь приведен пример для C++, но другие образцы имеют аналогичную логику):
cudaMemcpyAsync(bindings[inputId], inputTensor.data(), inputTensor.size() * sizeof(float), cudaMemcpyHostToDevice, stream);
context->enqueue(batchSize, bindings, stream, nullptr);
cudaMemcpyAsync(outputTensor.data(), bindings[1 - inputId], outputTensor.size() * sizeof(float), cudaMemcpyDeviceToHost, stream);
cudaStreamSynchronize(stream);
Когда эта копия данных предназначена для нескольких запросов, производительность повышается.
В примерах веб-камеры он обычно копирует данные видеокадра на устройство, выполняет логический вывод и копирует данные с устройства. Действия ставятся в очередь асинхронно, и в последней строке программа ожидает завершения всех действий.
Вопрос в том, есть ли способ продолжать копировать данные на устройство и обратно, не дожидаясь завершения всего процесса? Псевдокод может выглядеть так>:
while(1) {
if input queue not full, copy a request into the device.
if output queue not empty, copy a result from the device.
}
Я посмотрел документацию, не понял, какие вызовы API использовать для реализации такой логики. Был бы признателен, если бы кто-нибудь мог указать на пример или вызовы API.