3 枚のビデオ カードからビデオをキャプチャして表示するプログラムを作成しました。フレームごとに、フレームを Jpeg に圧縮し、ディスクに書き込むためにキューに入れるスレッドを生成します。これらのファイルから読み取り、独自のスレッドでデコードする他のスレッドもあります。通常、これは問題なく動作します。これは、6 つの CPU コアすべての約 70 ~ 80% を使用する、かなり CPU を集中的に使用するプログラムです。しかし、しばらくすると、エンコーディングが突然遅くなり、プログラムはビデオを十分に速く処理できなくなり、フレームを落とし始めます。CPU 使用率を確認すると、1 つのコア (通常はコア 5) があまり機能していないことがわかります。
これが発生した場合、プログラムを終了して再起動しても問題ありません。CPU 5 の使用率は依然として低く、プログラムはすぐにフレームのドロップを開始します。保存したビデオをすべて削除しても効果はありません。コンピューターを再起動することが唯一の解決策です。ああ、プログラムのアフィニティをセミアイドリングコア以外のすべてを使用するように設定すると、別のコアで同じことが起こるまで機能します。これが私のセットアップです:
- AMD X6 1055T (クール & 静音 OFF)
- GA-790FX-UD5 マザーボード
- 4Gig RAM アンギャングド 1333Mhz'
- Blackmagic Decklink DUO キャプチャー カード (x2)
- Linux - カーネル 2.6.32.29 を搭載した Ubuntu x64 10.10
私のアプリは以下を使用します:
- libjpeg-ターボ
- posix スレッド
- デッキリンク API
- Qt
- C/C++ で書かれています
- 動的にリンクされたすべてのライブラリ
Linux がコア上でスレッドをスケジュールする方法に何らかの問題があるように思えます。または、私のプログラムがひどく混乱して、プログラムを再起動するのに役立たない方法はありますか?
読んでくれてありがとう、どんな入力でも大歓迎です。私は立ち往生しています:)