Как наполнить движок 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.

0 ответов

Другие вопросы по тегам