Index / Reload

Comment on 2006-02-27

2006-02-27 について、コメントがあればどうぞ!
E-mail アドレスは公開されません。URL は公開されます。
なお、管理者の判断により予告なくコメントを削除することがあります。 ご了承下さい。

パスワードを入力すると後からコメントの修正が可能です。

確認:下の Check の項目に Zm3pp22J をコピーして入力してね。

お名前:
E-mail or URL:
Check: ← 上の方にある確認文字列を入力してね。
Password:
コメント:
* nminoru 2006-03-02 18:48:32 [Edit]

計測してみると実行時間の 80% ぐらいをシグナル処理に使っていますね(GCC -O5 でコンパイル)

〇 Null pointer exception からシグナルハンドラに到達するまでが 2032 サイクル。
// シグナルハンドラ
static void signal_handler(int sig, siginfo_t* sig_info, void* sig_data) {
counter += rditc() - tmp;
membar();
siglongjmp(return_point, 1);
}

// メイン
for (i = 0; i if (sigsetjmp(return_point, 1) == 0) {
tmp = rditc();
membar();
*p = 0;
}
}
printf("%lu\n", counter/REPEAT);

〇 sigsetjmp から siglongjmp で戻ってくるところまでが 2481 サイクル。
// メイン
tmp = rditc();
if (sigsetjmp(return_point, 1) == 0) {
membar();
*p = 0;
}
counter += tmp;
membar();
printf("%lu\n", counter/REPEAT);

* nminoru 2006-03-02 18:37:36 [Edit]

CPU サイクルカウンターは GCC だと以下のようなコードで動きました。
unsigned long rditc() {
unsigned long result = -1;
do {
__asm__ __volatile__ ("mov %0=ar.itc" : "=r"(result) :: "memory");
} while (__builtin_expect ((int) result == -1, 0));
return result;
}

* ポセ 2006-03-01 10:22:33 [Edit]

ia64で、インテルコンパイラが使えるなら、

#include
#define INL_REGID_APITC 3116
unsigned __int64 __getReg(int whichReg);
#define rditc() __getReg(INL_REGID_APITC)

と定義して、rditc()で測定区間を挟んで、サイクルで
カウントしたほうがより正確かも、、ですね。

Powered by くっつき BBS