我目前正在我的 GPU (CUDA/C++) 上实现运动跟踪算法,到目前为止,我看到了非常强劲的加速。然而,正如人们可能预期的那样,主要瓶颈是帧(图像)数据从 CPU 到 GPU 的实际传输。
照原样,我正在使用 OpenCV 读取测试视频文件。然而,OpenCV 以压缩字节的形式返回帧RRGGBB RRGGBB ...
,或者换句话说,每个像素都与 24 位边界对齐。这使我无法使用合并的内存访问,这会对 GPU 造成严重的性能损失。按原样,我只是使用一些预先生成的32 位对齐的测试数据(在表单中用零填充RRGGBB00 RRGGBB00 ...
),但我现在想开始使用实际的视频数据。
这给我带来了一些重大的性能损失,所以我有两个主要问题:
虽然我可以手动在 CPU 上对感兴趣的像素进行预处理,然后启动传输,但有没有什么方法可以快速将像素数据传输到 GPU,而是对齐到 32 位边界?(但是,我认为这与预处理具有相同的性能影响)
我可以使用另一个库以不同的格式阅读视频吗?例如,我知道 SDL 表面包含在 32 位边界中,即使没有包含 Alpha 通道。
我们实现的最终目标是与用于机器人控制的摄像头实时交互,尽管现在我只想要一些可以有效解码我的测试视频的东西,以使用预定义的测试数据测试我们的特征检测和运动跟踪算法.