2015-09-16 8 views
5

私は最近、C++での作業をやり直し、整数値の行列から最適なパスを見つける簡単なテストアプリケーションを作成しました。このアプリケーションのパフォーマンスを向上させるために、C++ 11 std :: threadを使用してマルチスレッドを実装しました。利用可能なすべてのスレッドを悪用して使用していますか?

unsigned int threadCount = std::thread::hardware_concurrency(); 
std::vector<std::thread> threads; 
for (unsigned int threadIndex = 0; threadIndex < threadCount; threadIndex++) { 
     threads.push_back(std::thread(&AltitudeMapPath::bestPath, this, threadCount, threadIndex)); 
} 

for (auto& thread : threads) { 
    thread.join(); 
} 

現在、私は利用可能なスレッドの総数を判断し、各スレッドに対してテストを実行します。

はそれ試してみて、与えられたシステムのために利用可能なすべてのスレッドを使用するには、悪い習慣です...これは素晴らしい仕事をしているが、それは私が考えるようになりましたか?この単純な例だけでなく、マルチスレッドのプロダクションレベルのアプリケーションは、できるだけ多くのスレッドを取り込もうとします(問題が許す限り)か、それほど貪欲ではありませんか?

おかげで、

+0

私はこの質問はかなり広いと思います。おそらくユーザーがスレッドの数を自分で指定できるようにプログラムにパラメータを追加するのでしょうか? –

+1

'std :: async'を見てください。それはあなたに生のスレッドよりもいくらか抽象度を与えます。実際の生産コードでは、タスクベースのライブラリを使用します。インテルTBB、マイクロソフトPPLまたはアップルGCD。 – Jens

+0

@Jensお役立ち情報さて、これは私をC++に戻すためのちょっとしたプロジェクトです...マルチスレッドとCUDAプログラミングを使いこなしています。しかし、大きな画像について考えるのは常に良いことです! – ductiletoaster

答えて

6

は、私は、アプリケーションが使用する必要がありますどのように多くのコアをシングル正しいのベストプラクティスは、ユーザーの好みに依存しないと思います。ユーザーがアプリケーションをできるだけ早く実行したい場合があり、ユーザーがマルチタスキングを行い、アプリケーションがボットダウンしたくない場合があります。

私は同様の問題に直面し、ユーザーは速度やCPUリソースの可用性の間で選択することができるように構成可能なスレッド数を作ることにしました。私は、同様の構成を使用する少なくとも1つのアプリケーションを考えることができるので、ユーザーに選択させることは珍しいとは思わない。上の他の作業を実行するユーザーのためのスレッドを解放するために1 - ユーザーのために選ぶことを余儀なくされている場合は

は、私は、ハードウェアのコアの数を使用してお勧めします。

またstd::thread::hardware_concurrency()がヒントであることを意図していると、それは決意を作ることができない場合は0を返すことが許可されていることに注意してください。時にはあなたは、プロセスが貪欲になりたいが、あなたが本当にプログラムのパフォーマンスを気にしないことがある:

+1

'ハードウェアコアの数-1 'は実際にはかなり良いです。すべてのコアを使用して、ほとんどの時間は、ユーザーにとっては良くありません。 –

+0

これは、アプリケーション/ユーザーのニーズに応じて異なる点があります。他の仕事のために少なくとも1つのコアを残すことについてのあなたの提案が好きです。私はOSが十分にスマートであると仮定しています.8つのスレッドが利用可能で、6を割り当てると、1つのコアはそのまま残ります。 – ductiletoaster

+0

@ductiletoaster一般的に、LinuxとWindowsは、過熱を防ぐために、処理コアを時折交換します。 –

関連する問題