このブログは、株式会社フィックスターズのエンジニアが、あらゆるテーマについて自由に書いているブログです。
命令単位の時間をはかってみましょう。この場合は、命令のクロック単位で知りたいことが多いので、CPU_CLK_UNHALTEDの値を使ってみます。
https://proc-cpuinfo.fixstars.com/2014/11/cpuclkunhalted.html
と、その前に、このCPU_CLK_UNHALTEDの値を取得する処理のオーバーヘッドも計測しておきましょう。read を使っているのでそれなりに大きな値になっている可能性があります。
https://bitbucket.org/fixstars/blog/src/76fcc97d7ab8df900b37592f852e52dbe34e1359/small_test/perf-read-overhead.c?at=master
動かしてみたところ、手元のマシンでは、平均 2000clk 程度のようです。計測対象が、200000clk(3.4GHz CPU で60usec)以上あるなら、オーバーヘッドは1%以下になるので無視して良いでしょう。
それでは以下のようにします
https://bitbucket.org/fixstars/blog/src/c25920cdac8cc69d4acd0ea2f1d493e147e398d1/small_test/inst-bench-template.c?at=master
GCC 拡張 asm を書いているので、あひーと思う人もいるかもしれませんが、今回は命令単位で計測したいので仕方ありません。
色々書いてますが、 ここ の
#define INST \
"add %%eax, %%eax\n\t"
の箇所に書かれた命令を計測しています。今回の場合は、32bit加算を計測しています。
これを動かすと、
$ ./a.out
add %%eax, %%eax
clk = 1.002997
などと出力されて、この命令が1clkで実行できることがわかります。
#define INST \
"add %%eax, %%eax\n" \
"add %%eax, %%eax\n\t"
$ ./a.out
add %%eax, %%eax
add %%eax, %%eax
clk = 2.010417
add をふたつ並べると、2clk になることがわかります。
さて、これで命令を計測する準備ができました…かのように見えますが、その前に、重要なことを確認しておきます。
二つ並んだ加算を次のように変更します
#define INST \
"add %%eax, %%eax\n" \
"add %%ecx, %%ecx\n\t"
すると、実行結果は以下のように変化します。
$ ./a.out
add %%eax, %%eax
add %%ecx, %%ecx
clk = 1.056262
eax の加算を二回実行した場合、処理時間は2clkでしたが、eax の加算と、ecx の加算を並べると、処理時間は1clkになりました。
現代のコンピュータは、さまざまな箇所が並列実行されるため、1個のデータに対して複数回処理を行う場合と、複数個のデータに対して、一回の処理を行う場合では、性能の特性が大きく変わります。
この現象は、命令単位での処理時間に限らず、メモリアクセス、マルチスレッド、HDD、プロジェクトの人員のアサイン(?)まであらゆるレイヤで見られる現象です。
次回、この違いについて、少し説明します。
コンピュータビジョンセミナーvol.2 開催のお知らせ - ニュース一覧 - 株式会社フィックスターズ in Realizing Self-Driving Cars with General-Purpose Processors 日本語版
[…] バージョンアップに伴い、オンラインセミナーを開催します。 本セミナーでは、...
【Docker】NVIDIA SDK Managerでエラー無く環境構築する【Jetson】 | マサキノート in NVIDIA SDK Manager on Dockerで快適なJetsonライフ
[…] 参考:https://proc-cpuinfo.fixstars.com/2019/06/nvidia-sdk-manager-on-docker/ […]...
Windowsカーネルドライバを自作してWinDbgで解析してみる① - かえるのほんだな in Windowsデバイスドライバの基本動作を確認する (1)
[…] 参考:Windowsデバイスドライバの基本動作を確認する (1) - Fixstars Tech Blog /proc/cpuinfo ...
2021年版G検定チートシート | エビワークス in ニューラルネットの共通フォーマット対決! NNEF vs ONNX
[…] ONNX(オニキス):Open Neural Network Exchange formatフレームワーク間のモデル変換ツー...
YOSHIFUJI Naoki in CUDAデバイスメモリもスマートポインタで管理したい
ありがとうございます。別に型にこだわる必要がないので、ユニバーサル参照を受けるよ...