2

请原谅我,无论如何我都不是多线程专家,需要一些帮助。所以在我回答我的问题之前,只有一些给定的知识:

预知识

  • 在 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.
}

问题) 所以我想知道的是,是否有办法指定我在构建新线程时将使用哪个核心/线程。我担心当我一遍又一遍地创建线程 A 和 B 时,它们会跳到不同的线程并妨碍我的系统速度和/或视频的阅读。虽然这种担心没有充分的理由,但我在运行代码时看到了四个内核上的非常奇怪的行为。通常,我总是会看到一个内核运行在 40-60% 左右,我认为它要么是主线程,要么是播放线程。但对于其他核心,计算负载非常跳跃。同样在整个应用程序播放过程中,我看到两个内核从大约 60% 一直到 100%,但这两个内核并没有保持不变。可能是第一,第二,第三,甚至是第四核,然后它们通常会大幅下降到大约 20->40%。偶尔我会看到只有 1 个核心下降到 0% 并保持这种状态,这似乎是通过 while 循环的另一个循环(即抓取帧、进程、线程 A、线程 B、重复)。然后我会看到他们四个都再次活跃,这是更预期的行为。

我希望我在这篇文章中没有太含糊。我只是看到我的行为有点出乎意料,我想了解我可能做错了什么或没有考虑到什么。感谢任何可以帮助或指出正确方向的人。

4

0 回答 0