C言語にて、XORの演算時間を取得するには?
題名の通りです。
C言語で、XOR命令の演算時間を取得しようとしています。演算時間を取得する関数部分は下の通りで、a^=b, b^=aをひたすら繰り返すことで、命令の演算時間を取得する、というものです。この方法を使って、ADD命令については演算時間を取得できました。しかし、XORについては、計測時間がほぼゼロになり、XORが動いていないようです。
その理由は、同じ値をXORすると元に戻るというXORの原理のため、コンパイラの最適化によりfor文内のXOR命令が消えてしまったからだと考えられます。
かといって、t1とt2にvolativeを付けて宣言すれば、最適化によって消去はされませんが、volativeの性質上、メモリアクセスの時間を取得することになってしまいます。
どうすれば、XOR命令のみの演算時間を取得できるでしょうか。
アイディアや指摘がありましたら、どうかご教授下さい。
--------------------------------------------------------------
#define ADD(a, b) a+=b
#define XOR(a, b) a^=b
/* 10回反復するマクロ */
#define repeat10(S) S S S S S S S S S S
/* 各命令の演算時間を計測する関数 */
void operation_test(
unsigned int *out,
unsigned int p1,
unsigned int p2,
int its)
{
/* volatileを付けた宣言だと、t1とt2はメモリに取られるため、目的を達成できない */
unsigned int t1 = p1;
unsigned int t2 = p2;
/* itsは反復回数 */
for(int i=0; i<its; i++){
/* いずれかの行を選択する。ADDはきちんと演算されているよ */
/* うだが、XORは最適化により消去されてしまっているらしい */
repeat10(ADD(t1, t2); ADD(t2, t1); )
//repeat10(XOR(t1, t2); XOR(t2, t1); )
}
out[0]=t1+t2;
}
--------------------------------------------------------------
お礼
ありがとうございます。 というか、勉強不足なのでしょうか・・・。 助かりました。 ヘルプを見てもよくわからなかったのですが、本当に助かりました。 ありがとうございます!