请原谅我,无论如何我都不是多线程专家,需要一些帮助。所以在我回答我的问题之前,只有一些给定的知识:
预知识
- 在 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、重复)。然后我会看到他们四个都再次活跃,这是更预期的行为。
我希望我在这篇文章中没有太含糊。我只是看到我的行为有点出乎意料,我想了解我可能做错了什么或没有考虑到什么。感谢任何可以帮助或指出正确方向的人。