Запуск процесса несколько раз одновременно

0

У меня есть программа c++ с библиотекой opencv, которая принимает изображение в качестве входных данных и выполняет оценку позы, определение цвета, фог. Когда я запускаю эту программу из командной строки, она занимает около 4-5 секунд для завершения. Он занимает около 60% процессора. Когда я пытаюсь запустить ту же программу из двух разных окон командной строки, процесс занимает около 10-15 секунд для завершения, и оба процесса завершаются почти в одно и то же время. Использование ЦП достигает 100%.

У меня есть веб-сайт, который вызывает этот c++ exe, используя команду exec(). Поэтому, когда два пользователя пытаются загрузить изображение и запускать его, требуется больше времени, как я объяснил выше в командной строке. Это потому, что программа c++ включает в себя высокие вычисления, а ЦП достигает 100%, что замедляется? Но я читал, что процессор, достигающий 100%, не так уж плох, поскольку компьютер использует свою полную емкость для запуска программы. Так это из-за моей c++ программы или это как-то связано с настройками моего сервера (компьютера)? Вероятно, это не проблема сервера Apache, потому что когда я пытаюсь запустить ее из командной строки, она замедляется. Я использую четырехъядерный процессор, и все 4 процессора достигает 100%, когда я пытаюсь запустить один и тот же процесс одновременно, поэтому я думаю, что он распространяется среди всех процессоров. Поэтому у меня есть еще несколько вопросов:

1) Можно ли это решить, используя многопоточность в моем коде c++? На данный момент я не использую его, но многопоточность сделает код c++ более дорогостоящим и увеличит использование ЦП (если это проблема).

2) Что может быть причиной его замедления? Является ли процесс в очереди, и каждый процесс выполняется только определенное количество времени, и он переключается между двумя процессами?

3) Если это связано с тем, что оно связано с большими вычислениями, поможет ли мне сменить некоторые функции на opencv gpu?

4) Есть ли способ решить эти проблемы любыми идеями или советами?

Я вставлял результат top при запуске одного процесса и одновременно выполнял один и тот же процесс:

Version5 - это процесс, запускающий его один раз Изображение 174551 Two Version5 работает одновременно Изображение 174551

Информация о CPU: Изображение 174551

Заранее спасибо.

  • 0
    На самом деле, не видя ваш код, трудно сказать точно, что делает код ... Но это кажется немного подозрительным.
  • 0
    Это также помогло бы понять, какие у вас процессоры. Например, процессор Intel Hyperthreading будет вести себя иначе, чем процессор с «четырьмя реальными ядрами».
Показать ещё 4 комментария
Теги:
opencv
multithreading
command-line

2 ответа

2

После масштабирования, чтобы ваше изображение заполнило почти весь мой 22-дюймовый экран, я могу понять, что флажки CPU показывают "ht", что означает "гиперпоточность", поэтому у вас на самом деле есть только два подлинных ядра, которые разделяются между двумя гиперпотоками. работа на всех четырех ядрах процессора сразу не даст такой же производительности, как работа на двух оригинальных ядрах.

Другими словами, "потеря производительности" полностью, как и следовало ожидать, потому что у вас есть четыре потока, сражающихся за фактические вычислительные ресурсы двух ядер процессора. Hyperthreading помогает, если код имеет много взаимодействия с памятью, которое может быть "скрыто", запустив второй поток. Но если у вас интенсивный код с процессором, который не является "отсутствующим в кеше", то коэффициент усиления намного меньше, а в крайних случаях гиперпоточность фактически приведет к замедлению (потому что код в одном потоке нарушает кеширование и в противном случае "мешает" первого потока). Вы можете поэкспериментировать, перейдя в настройки BIOS и выключите гиперпоточность и сравните результаты. Конечно, запуск двух экземпляров кода явно будет занимать больше времени, но вопрос заключается в том, "это длиннее, чем работа с гиперпотоком" - к сожалению, невозможно точно сказать, что лучше с теоретической точки зрения (даже если бы я мог видеть код сборки и понял шаблоны доступа к памяти - без этого уровня детализации, это совершенно невозможно судить).

1
  1. При запуске только одного процесса достигает 60% использования ЦП, было бы возможно, что использование многопоточности ускоряет выполнение. Однако использование ЦП, вероятно, будет выше
  2. Это правда. Для переключения контекста (многозадачности) могут возникать дополнительные накладные расходы,
  3. Изменение функций может принести некоторые улучшения, но без вашего кода это сложно сказать.
  4. Поскольку вычислительные усилия настолько высоки, я думаю, вам нужно решить, принимаете ли вы высокую загрузку процессора или более длительное время выполнения (конечно, после оптимизации самого кода)

Greetz

Ещё вопросы

Сообщество Overcoder
Наверх
Меню