如何使软件并行运行,c ++,directshow,opencv

时间:2013-06-11 08:20:40

标签: c++ parallel-processing

我过去几个月一直在研究一个面部跟踪系统,现在我需要让所有东西并行运行以提高性能。

主要的cpp文件是:

int _tmain(int argc, _TCHAR* argv[])
{
    cFrame.initCamFrames(20, 1600, 1200, 3);     //INITIATES BUFFER FOR CAM FRAMES, 20 frames, res:1600x1200, 3bytes per pixel.
    eyeTracking.initTrackingSystem(&cFrame);     //INITIATES EYETRACKING SOFTWARE WITH POINTER TO THE BUFFER WHERE EYETRACKINGSOFTWARE GETS THE FRAMES TO SEARCH WITHIN. (opencv)


    directShow directShowClass;          
    directShowClass.initiateDirectShow(false, &cFrame);     //INITIATES DIRECTSHOW WITH POINTER TO BUFFER WHERE IT SHOULD SAVE FRAMES FROM CAM
    directShowClass.runDirectShow();        //START CAPTURING FRAMES INTO BUFFER
    eyeTracking.runTrackingSystem();        //START SEARCH FOR FACE AND EYES.

    system("pause");
    directShowClass.stopDirectShow();
}

我想要“directShowClass.runDirectShow();”和“eyeTracking.runTrackingSystem();”以真正的平行方式运行。现在我认为它们在伪并行中作为线程运行。 (每种方法中的简单printf在终端中混合出来)。

我想让一个程序并行运行并不像我希望的那样简单。但我猜这有可能:D

请给我一些建议,从哪里开始搜索有关如何进行paralellisize的信息。

我有双核处理器。

谢谢!

2 个答案:

答案 0 :(得分:0)

Printf不是线程安全的,也就是说它可以像你遇到的那样混淆缓冲区。您可以以伪并行方式运行该进程(例如将每个调用切换到另一个处理步骤)或以硬件并发方式运行(std :: thread,pthreads,windows thread,boost :: thread)。

如果您有双核处理器,您肯定可以利用多核处理,我建议使用boost。

答案 1 :(得分:0)

要清除,通过使用线程,您可以获得真正的并行性。但请记住,您的计算机也在其核心中运行,其他进程在后台占用CPU时间,因此您的功能并不总是被执行。

为了在C ++中获得一些并行性,你有很多选择。我说三个:

。最古老的最常用方法是使用pthread库,它几乎内置于每个编译器中。

。新的C ++标准,称为C++11,包括一些处理多线程的本机库,你可以检查出来,但每个编译器仍然不支持它。大多数支持它的编译器只有部分功能。您还需要明确激活标准。例如:

gcc -std=c++11

。最后,如果您想要一些“更高级别”的东西,您可以花一些精力学习OpenMP框架,它使用pragma指令来注释并行任务。然后框架将处理所有线程的创建,因此您可以将时间用在其他一些东西上。

P.S:输出混合的原因不是因为线程以伪并行方式运行,而是因为它们在缓冲区上同时写入。因此,当缓冲区被转储时,您会在线程写入它时看到它。如果有的话,这证明它们实际上是并行运行的,但是你要让它们在同一个缓冲区中写出它们的输出;)