0

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

主要的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

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

我有一个双核处理器。

谢谢!

4

2 回答 2

0

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

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

于 2013-06-11T09:18:18.430 回答
0

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

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

. 最古老最常用的方法是使用几乎每个编译器都内置的pthread库。

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

gcc -std=c++11

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

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

于 2013-06-11T09:19:06.390 回答