Повлияет ли многопоточность на производительность обработки изображений в Raspberry Pi? - PullRequest
0 голосов
/ 19 апреля 2019

Я работаю над проектом об автономном транспортном средстве.В этом проекте обработка видео в реальном времени выполняется на Raspberry Pi (модель 3B) с использованием Opencv 4.0 в C ++.В передней части автомобиля также есть датчик дальности, расстояние до случайного препятствия.Задача - остановить машину, если в пределах 1 метра есть препятствие.

Чтобы реализовать эту задачу, я использую потоки в моей структуре программирования.Я разработал обработку изображений в качестве основной резьбы, а измерение расстояния - в качестве боковой резьбы.Меня беспокоит то, повлияет ли эта структура на скорость обработки изображений или нет.Есть ли у вас какие-либо идеи?Кроме того, мне интересно, если основной поток использует 4 ядра Raspberry Pi?Если это так, будет ли вводить нить в разделенное ядро ​​структуры как 3 для обработки изображения и 1 для измерения датчиком расстояния?

Я совершенно не уверен в этом.Дизайн в моей голове можно увидеть в фрагменте ниже (обратите внимание, что основной поток зацикливается бесконечно):

int measuredDistance;
int distanceThreshold = 1; // 1 meter

void * sensor_thread(void * threadid) {
   // measure distance
   // update measuredDistance 
}

int main () {
   while(1){
      // do image processing
      if (measuredDistance < distanceThreshold)
         stopTheCar();
   }
}

1 Ответ

3 голосов
/ 19 апреля 2019

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

Может ли ваша система выполнять более 1 потока одновременно - многоядерный, многопоточный или гиперпоточный, или что-то еще. Если я вас правильно понимаю, ваш Pi может обрабатывать до 4 потоков одновременно. Это хорошо, и вы настроены на многопоточную программу.

Отвечая на ваш вопрос: в основном потоке используются все 4 ядра? В основном нет, основной поток - это только один поток, который работает на одном ядре. Ваша измерительная нить будет работать на другом ядре.

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

Я коротко, вы не можете ожидать от нас четкого ответа. Это зависит от вашей реализации и вашей системы, что еще она должна делать и где хранятся ваши данные ... и так далее, и так далее ... НО, если вы прочитаете несколько хороших книг и выберете мудро, как реализовать свои обработки изображений, я бы ожидал улучшения производительности.

Если вы хорошо разбираетесь в оценках, существует математический подход. Это объясняется более подробно в этой ССЫЛКЕ .

Формула распараллеливания:

S(n) = 1/( (1-P) + P/n )
  • S (n) - теоретическое ускорение
  • P - часть алгоритма, которая может быть сделана параллельной
  • n - количество потоков процессора

В сущности, это говорит о том, что скорость ускорения, которую программа увидит, используя n ядер, зависит от того, какая часть программы является последовательной (может быть запущена только на одном ядре ЦП) и насколько она параллельна. (можно разделить между несколькими ядрами процессора).

...