![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
題名の通りです。
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件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
XORといっても変数の取り方などで同じコードを出力するとは限らないし演算途中での割込を考慮すれば意味が無いような気もするが。
コンパイルオプションで最適化しない設定にする。
アセンブリリストを出してクロック数を手計算する。
この回答への補足
ありがとうございます。
反復回数をもっと大きくしたときに、全てのXORする値を準備するわけにもいかないので、難しいです。
割り込みについては、組み込み環境ではないので、発生しないという前提です。
>コンパイルオプションで最適化しない設定にする。
やってみましたが、ダメでした。
>アセンブリリストを出してクロック数を手計算する。
前の質問者様と同じ理由で、アセンブリから攻めるといった方法は使いたくないという状況です。
説明不足で済みません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 ( A xor B ) xor B = A となることを論理演算表で完成させてください。 4 2022/10/27 02:12
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- C言語・C++・C# C言語 ポインタ 配列 2 2022/06/02 17:29
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- 計算機科学 進数の計算について質問です。 16進数のxorだったら0x7fffと0x8000の計算はどうなります 2 2022/05/17 10:11
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- CPU・メモリ・マザーボード CPUがメモリ上の命令を実行する流れについての質問です。 3 2023/05/05 01:41
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
一般のソフトで画像を扱う場合...
-
0xffffとは?
-
10進数(+-)→2進数への変換(2)
-
エクセルVBAのIf,Then 構...
-
verilog 符号付加減算(最上位...
-
PLC 命令について
-
ビットシフトってどんな時使うの?
-
PS3に搭載されている"Cell"は、...
-
1の補数
-
アセンブリの論理演算命令のCPL...
-
FFTの単精度と倍精度の計算時間
-
量子コンピュータとDNAコンピュ...
-
Z80、6502、i8086、MC68000につ...
-
PICでスピードメーターを作...
-
昔のゲーム製作に使用する言語...
-
H8/3069Rでパルス時間間隔測定
-
PICはアセンブラとC言語のどち...
-
7セグメントLEDの点灯について
-
アセンブラエディタ
-
C言語のライブラリ関数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
8ビットのデータの、先頭ビット...
-
情報科学の飽和演算、ラップア...
-
ビットシフトってどんな時使うの?
-
一般のソフトで画像を扱う場合...
-
文字参照は10進数と16進数では...
-
スロースキャンコンピュータ 加...
-
C言語で128bitの2進数のビット...
-
命令について
-
シーケンス制御についての質問...
-
03分22秒36のような時間の単位...
-
verilog 符号付加減算(最上位...
-
[VBS] 素早くローテート演算したい
-
CASLIIでかけ算
-
符号無し整数xを右にnビット回転
-
算術シフト演算が成り立つ理由...
-
PLC 命令について
-
二元対称無記憶通信路を実現す...
-
2の補数
おすすめ情報