Из-за чего моя программа через некоторое время могла не использовать все ядра?

Я написал программу, которая захватывает и отображает видео с трех видеокарт. Для каждого кадра я создаю поток, который сжимает кадр до Jpeg, а затем помещает его в очередь для записи на диск. У меня также есть другие потоки, которые читают из этих файлов и декодируют их в своих собственных потоках. Обычно это работает нормально, это довольно интенсивная программа, использующая около 70-80 процентов всех шести ядер процессора. Но через некоторое время кодирование внезапно замедляется, программа не может достаточно быстро обрабатывать видео и начинает пропускать кадры. Если я проверю загрузку процессора, то вижу, что одно ядро ​​(обычно ядро ​​5) больше не работает.

Когда это произойдет, не имеет значения, выйду ли я и перезапущу свою программу. ЦП 5 по-прежнему будет иметь низкую загрузку, и программа немедленно начнет отбрасывать кадры. Удаление всего сохраненного видео тоже не имеет никакого эффекта. Помогает только перезагрузка компьютера. Да, и если я настрою привязку моей программы к использованию всего ядра, кроме полунепрерывного, она будет работать до тех пор, пока то же самое не произойдет с другим ядром. Вот моя установка:

  • AMD X6 1055T (Cool & Quiet OFF)
  • Материнская плата GA-790FX-UD5
  • 4Gig RAM без изменений, 1333Mhz '
  • Карты захвата Blackmagic Decklink DUO (x2)
  • Linux - Ubuntu x64 10.10 с ядром 2.6.32.29

В моем приложении используются:

  • libjpeg-turbo
  • потоки posix
  • decklink api
  • Qt
  • Написано на C / C ++
  • Все библиотеки связаны динамически

Мне кажется как будто это какая-то проблема с тем, как Linux планирует потоки на ядрах. Или есть какой-то способ, по которому моя программа может так сильно испортиться, что ее перезапуск не поможет?

Спасибо за чтение, любой ввод приветствуется. Я застрял :)

8
задан iH8 18 November 2014 в 17:58
поделиться