dポイントプレゼントキャンペーン実施中!

題名の通りです。
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;
}
--------------------------------------------------------------

A 回答 (2件)

XORといっても変数の取り方などで同じコードを出力するとは限らないし演算途中での割込を考慮すれば意味が無いような気もするが。




コンパイルオプションで最適化しない設定にする。
アセンブリリストを出してクロック数を手計算する。

この回答への補足

ありがとうございます。
反復回数をもっと大きくしたときに、全てのXORする値を準備するわけにもいかないので、難しいです。
割り込みについては、組み込み環境ではないので、発生しないという前提です。


>コンパイルオプションで最適化しない設定にする。
やってみましたが、ダメでした。

>アセンブリリストを出してクロック数を手計算する。
前の質問者様と同じ理由で、アセンブリから攻めるといった方法は使いたくないという状況です。
説明不足で済みません。

補足日時:2012/10/18 14:58
    • good
    • 0

インラインアセンブラの使用はダメですか。

コンパイルオプションで最適化なしにするとかは。

この回答への補足

ありがとうございます。
実は、この関数を最終的にOpenCLというGPGPUの開発環境へ移植したいと考えています。
OpenCLはインラインアセンブラをサポートしておらず、そのため現時点でもオンラインアセンブラを使用したくないという事情があります。
説明不足で申し訳ありませんでした。

コンパイラオプションについても、g++コンパイラ使用で、オプション-O0でもダメだったことを確認済みです。

補足日時:2012/10/18 14:53
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!