タイミング

並列プログラムのパフォーマンスは、通常、CPU 時間ではなく、時計 時間で測定します。これは、並列化が進むにつれ、より多くの CPU を使用し、CPU の総時間が増加するためです。プログラムの並列化の最終目的は、リアルタイムでプログラムをより速く 実行することです。

インテル® スレッディング・ビルディング・ブロック (インテル® TBB) の tick_count クラスは、時計時間を取得する単純なインターフェイスを提供します。tick_count の値は、現在の絶対時間を表すスタティック・メソッド tick_count::now() から取得されます。2 つの tick_count 値を引くと、tick_count::interval_t で相対時間値が求められます。この値は次の例のように、秒に変換することができます。

tick_count t0 = tick_count::now();
... 時間計測する処理を実行 ...
tick_count t1 = tick_count::now();
printf("経過時間 %g 秒\n",(t1-t0).seconds());
    

一部の時間計測インターフェイスとは異なり、tick_count は複数のスレッドで使用しても安全であることが保証されています。異なるスレッドで作成された tick_count 値の差分を求められます。tick_count の差分は秒に変換することができます。

tick_count の分解能は、同一プロセス内の複数のスレッド間で有効な、プラットフォームで最も高い分解能タイミングサービスに対応します。プラットフォームによっては、CPU タイマーレジスターは複数のスレッドにわたって有効ではない ため、tick_count の分解能はプラットフォーム間で一貫性があることは保証できません。

Linux* では、tbb::tick_count クラスを使用するときリンカーコマンドに -lrt を追加する必要があります。詳細は、http://fedoraproject.org/wiki/Features/ChangeInImplicitDSOLinking を参照してください。