サイクルタイムを測定しよう (6) [PSoC]
前回の実験で、分岐命令のサイクルタイムが命令が配置されたアドレスに依存する事がわかりました。 今回は、さらに、他の要素が無いか調べます。
分岐距離による違い
前回は分岐命令のアドレスによりサイクルタイムが変化する様子が観測されました。 今回は、分岐命令のアドレスを固定して、分岐先のアドレスを変化させてみます。 分岐先を変化させるために、以下のようなソースコードを作成し、 NOP 命令の数で分岐距離を調整します。
// Measure the execution cycle time uint32 measure(reg32 *reg) __attribute__((aligned(256))); uint32 measure(reg32 *reg) { uint32 s; uint32 e; s = *reg; asm( "b label_2\n" "nop\n" // 5 "nop\n" // 4 "nop\n" // 3 "nop\n" // 2 "nop\n" // 1 "label_2:\n" ); e = *reg; return e - s; }
実験結果
NOP 命令の数を最大14まで変えてサイクルタイムを測定しました。
NOP数 | サイクル数 48/24/12 | 分岐先アドレス |
---|---|---|
0 | 7/7/7 | 0004 |
1 | 7/7/7 | 0006 |
2 | 7/7/7 | 0008 |
3 | 7/7/7 | 000A |
4 | 7/7/7 | 000C |
5 | 8/7/7 | 000E |
6 | 9/8/7 | 0010 |
7 | 9/8/7 | 0012 |
8 | A/8/7 | 0014 |
9 | B/9/7 | 0016 |
10 | 9/8/7 | 0018 |
11 | 9/8/7 | 001A |
12 | A/8/7 | 001C |
13 | B/9/7 | 001E |
14 | 9/8/7 | 0020 |
このように分岐命令を同じアドレスに配置した場合でも、分岐先アドレスによってサイクルタイムが影響を受ける事がわかりました。 おおよそ8バイトごとの繰り返しになっています。 中には、11サイクル (B) という結果も出ていました。 つまり、分岐命令の実行時間として3サイクルから7サイクルまで幅が観測された事を示しています。
NOP が7個までの部分では、それほどサイクル数が長くなっていません。 これは、プリフェッチがうまく機能したためと考えられます。
コメント 0