Я попробовал ваше предложение. Он не работает надежно и есть артефакты доступа к памяти.
Первый код:
входной поток:
cudaStream_t m_stream;
cudaEvent_t m_streamEvent;
cudaStreamCreateWithFlags(&m_stream, cudaStreamNonBlocking);
cudaEventCreate(&m_streamEvent);
int bytesPerPixel = 2;
int bytes = width * height * bytesPerPixel;
while(!stop)
{
// Read from file to m_imageData
// Next buufer is pinned memory allocated with af::pinned
nextBuffer = getWriteBuffer();
cudaMemcpyAsync(nextBuffer, m_imageData.data() + m_imageOffset, bytes, cudaMemcpyHostToDevice, m_stream);
cudaEventRecord(m_streamEvent, m_stream);
cudaStreamWaitEvent(m_stream, m_streamEvent, 0);
m_imageOffset = (m_imageOffset + bytes) % m_imageData.size();
}
Процессорный поток:
tile x frames (batch) from ring buffer and push the result to a queue
Выходной поток:
cudaStream_t m_stream;
cudaEvent_t m_streamEvent;
cudaStreamCreateWithFlags(&m_stream, cudaStreamNonBlocking);
cudaEventCreate(&m_streamEvent);
int rgbaBufferSize = width * 4;
auto m_rgbaPinnedBuffer = af::pinned<quint8>(rgbaBufferSize);
while(!stop)
{
rgba = m_queue.dequeue();
rgbaAfBuffer = rgba.device<quint8>();
cudaMemcpyAsync(m_rgbaPinnedBuffer, rgbaAfBuffer, rgbaBufferSize, cudaMemcpyDeviceToHost, m_stream);
cudaEventRecord(m_streamEvent, m_stream);
cudaStreamWaitEvent(m_stream, m_streamEvent, 0);
rgba.unlock();
// Do something with m_rgbaPinnedBuffer
}
При запуске с профилировщиком NVidia я вижу поток AF, я вижу поток выходного потока с выходами memcpy. Я не вижу поток входного потока, в котором есть memcpy. Я не знаю почему, хотя создание потока и события было сообщено успешно.
При использовании af :: host проблем с доступом к памяти нет, и я можно увидеть, что cudaMemcpyAsyn c происходит в потоке по умолчанию. Выходной RGBA выглядит следующим образом ![enter image description here](https://i.stack.imgur.com/cxpMX.png)
При использовании cudaMemcpyAsyn c я вижу cudaMemcpyAsyn c на временной шкале потока, но иногда память повторяется. Это происходит чаще, когда я увеличиваю размер пакета или перемещаю другое приложение windows время быстрой кражи GPU. См. Вывод RGBA ![enter image description here](https://i.stack.imgur.com/gqsXb.png)
Вы сталкивались с такой проблемой?