Index / Reload
計測してみると実行時間の 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);
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;}
ia64で、インテルコンパイラが使えるなら、#include #define INL_REGID_APITC 3116unsigned __int64 __getReg(int whichReg);#define rditc() __getReg(INL_REGID_APITC)と定義して、rditc()で測定区間を挟んで、サイクルでカウントしたほうがより正確かも、、ですね。
計測してみると実行時間の 80% ぐらいをシグナル処理に使っていますね(GCC -O5 でコンパイル)
if (sigsetjmp(return_point, 1) == 0) {
〇 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
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);
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;
}
ia64で、インテルコンパイラが使えるなら、
#include
#define INL_REGID_APITC 3116
unsigned __int64 __getReg(int whichReg);
#define rditc() __getReg(INL_REGID_APITC)
と定義して、rditc()で測定区間を挟んで、サイクルで
カウントしたほうがより正確かも、、ですね。