我正在构建一个应用程序,它将从摄像机源进行一些对象跟踪,并使用其中的信息在OpenGL中运行粒子系统.处理视频输入的代码有点慢,现在每帧200到300毫秒.将运行的系统具有双核处理器.为了最大限度地提高性能,我希望将相机处理内容卸载到一个处理器,只需将相关数据传送回主应用程序,同时保持主应用程序在另一个处理器上运行.
如何将相机工作卸载到其他处理器以及如何处理与主应用程序的通信需要做什么?
编辑:我正在运行Windows 7 64位.
pes*_*669 12
基本上,您需要多线程化您的应用程序.每个执行线程只能使一个核心饱和.单独的线程往往在不同的核心上运行.如果你坚持每个线程总是在特定的核心上执行,那么每个操作系统都有自己的方法来指定它(亲和掩码等)...但我不推荐它.
OpenMP很棒,但它在屁股上有点胖,特别是在从并行化加入时.因人而异.它易于使用,但根本不是最好的选择.它还需要编译器支持.
如果您使用的是Mac OS X 10.6(Snow Leopard),则可以使用Grand Central Dispatch.阅读有趣,即使你不使用它,因为它的设计实现了一些最佳实践.它也不是最佳的,但它比OpenMP更好,即使它也需要编译器支持.
如果您可以将应用程序分解为"任务"或"作业",那么您可以将这些作业推到尽可能多的管道中.考虑将处理批处理为原子工作单元.如果您可以正确分割它,您可以同时在两个核心和主线程上运行相机处理.
如果每个工作单元的通信最小化,那么您对互斥锁和其他锁定原语的需求将被最小化.课程粒度线程比细粒度更容易.而且,您始终可以使用库或框架来减轻负担.如果采用手动方法,请考虑Boost的线程库.它提供了便携式包装器和一个很好的抽象.