2

Intel TBB を使用するコードがいくつかあり、32 コアのマシンで実行しています。コードでは、私は使用します

parallel_for(blocked_range (2,left_image_width-2, left_image_width /32) ...

並行作業を行うスレッドに 32 を生成する場合、競合状態はなく、各スレッドに同じ量の作業が与えられることが期待されます。プログラムの所要時間を測定するために clock_t を使用しています。特定の画像の場合、完了するまでに約 19 秒かかります。

次に、インテル® Parallel Studio でコードを実行したところ、コードは 2 秒で実行されました。これは私が期待していた結果ですが、なぜこの 2 つに大きな違いがあるのか​​ わかりません。time_t はすべてのコアのクロック サイクルを合計しますか? それでも意味がありません。以下は、問題のスニペットです。

clock_t begin=clock();

create_threads_and_do_work();

clock_t end=clock();
double diffticks=end-begin;
double diffms=(diffticks*1000)/CLOCKS_PER_SEC;
cout<<"And the time is "<<diffms<<" ms"<<endl;

アドバイスをいただければ幸いです。

4

1 に答える 1

0

実行時間の違いが 2 つの異なる入力 (画像) の結果なのか、単に 2 つの異なる実行時間測定方法の結果なのか (clock_t の差と Intel ソフトウェアの測定値) は明確ではありません。さらに、create_threads_and_do_work() で何が起こっているかを示していません。使用しているインテル® Parallel Studio 内のどのツールについても言及していませんが、それは Vtune ですか?

あなたの clock_t difference メソッドは、それを呼び出したスレッド (この例ではメイン スレッド) の処理時間を合計しますが、create_threads_and_do_work() 内で生成されたスレッドの処理時間をカウントしない場合があります。それができるかどうかは、その関数内ですべてのスレッドが完了するのを待ってから関数を終了するか、単にスレッドを生成してすぐに (処理が完了する前に) 終了するかによって異なります。関数で実行するのが parallel_for() だけである場合、clock_t の違いは正しい結果をもたらし、他のランタイム測定と変わらないはずです。

Intel Parallel Studio には、Vtune と呼ばれるプロファイリング ツールがあります。は強力なツールであり、プログラムを実行すると、コード内の各関数の処理時間 (および呼び出された時間) を (グラフィカルに楽しい方法で) 表示できます。これをやった後、あなたはおそらくそれを理解するでしょう。

最後のアイデア - インテルのソフトウェアを使用した場合、プログラムはコースを完了しましたか? Vtune がしばらくの間データを収集した後、プログラムを完了させずに停止することがあるため、質問しています。

于 2014-11-15T05:38:32.707 に答える