在约束条件下分配和管理特定线程

时间:2015-05-12 12:34:50

标签: c++ multithreading opencv optimization tegra

原谅我,因为我不是任何方式的多线程专家,需要一些帮助。所以在我提出问题之前,只需要一些知识:

预知识

  • 在Jetson TK1上开发C ++代码
  • Jetson有4个CPU内核(四核CPU ARMv7 CPU)
  • 根据我的研究,每个核心可以使用一个线程(4个核心 - > 4个线程)
  • 我正在运行一个使用OpenCV
  • 的计算机视觉应用程序
  • 从网络摄像头捕获帧以及从视频文件中抓取帧

伪代码  我正在尝试优化我的多线程代码,以便我可以获得应用程序的最大性能。目前这是我的代码的基本布局:

int HALT=0;

//Both func1 and func2 can be ran parallel for a short period of time
//but both must finish before moving to the next captured webcam frame
void func1(*STUFF){
    //Processes some stuff
}
void func2(*STUFF){
    //Processes similar stuff
}

void displayVideo(*STUFF){
    while(PLAYBACK!=DONE){
        *reads video from file and uses imshow to display the video*
        *delay to match framerate*
    }
    HALT=1;
}
main{
    //To open these I am using OpenCVs VideoCapture class
    *OPEN VIDEO FILE* 
    *OPEN WEBCAM STREAM*
    thread play(displayVideo, &STUFF);
    play.detach();
    while(HALT!=1){
        *Grab frame from webcam*
        //Process frame
        thread A(func1,&STUFF);
        thread B(func2,&STUFF);
        A.join();
        *Initialize some variables and do some other stuff*
        B.join();
        *Do some processing... more than what is between A.join and B.join*
        *Possibly display webcam frame using imshow*
        *Wait for user input to watch for terminating character*
    }
    //This while loop runs for about a minute or two so thread A and thread
    //B are being constructed many times.
}

问题(S) 所以我想知道的是,如果有一种方法可以指定在构造新线程时我将使用哪个核心/线程。我担心当我一遍又一遍地创建线程A和B时,它们会跳到不同的线程并妨碍我的系统速度和/或视频的读取。尽管这种担心并不合理,但在运行代码时,我发现四核上存在非常奇怪的行为。通常情况下,我总会看到一个核心运行在40-60%左右,我认为它是主线程或播放线程。但至于其他核心,计算负荷非常大。在整个应用程序播放过程中,我看到两个内核从大约60%一直到100%,但这两个内核不会保持不变。它可以是第一,第二,第三或甚至第四核心,然后它们通常会大大下降到大约20-> 40%。偶尔我会看到只有1个核心下降到0%并保持这种方式,看起来是通过while循环的另一个循环(即抓取帧,进程,线程A,线程B,重复)。然后我会看到它们中的所有四个都再次激活,这是更期望的行为。

我希望我在这篇文章中并不是太模糊。我只是看到我得到了一些意想不到的行为,我想了解我可能做错了什么或不做什么。感谢任何人可以帮助或指出我正确的方向。

0 个答案:

没有答案