Назначение и управление определенными потоками в ограничениях

Простите, я не специалист по многопоточности, и мне нужна помощь. Итак, просто некоторые знания, прежде чем я вернусь к своему вопросу:

Предварительное знание

  • Разработка кода C ++ на Jetson TK1
  • Jetson имеет 4 ядра процессора (четырехъядерный процессор 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, повтор). Затем я снова увижу всех четверых активными, что является более ожидаемым поведением.

Я надеюсь, что я не был слишком расплывчат в этом посте. Я просто вижу, что у меня немного неожиданное поведение, и я хотел бы понять, что я могу делать неправильно или не учитывать. Спасибо всем, кто может помочь или указать мне в правильном направлении.

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]