So-net無料ブログ作成
検索選択

サイクルタイムを測定しよう (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
分岐先アドレス
07/7/70004
17/7/70006
27/7/70008
37/7/7000A
47/7/7000C
58/7/7000E
69/8/70010
79/8/70012
8A/8/70014
9B/9/70016
109/8/70018
119/8/7001A
12A/8/7001C
13B/9/7001E
149/8/70020

このように分岐命令を同じアドレスに配置した場合でも、分岐先アドレスによってサイクルタイムが影響を受ける事がわかりました。 おおよそ8バイトごとの繰り返しになっています。 中には、11サイクル (B) という結果も出ていました。 つまり、分岐命令の実行時間として3サイクルから7サイクルまで幅が観測された事を示しています。

NOP が7個までの部分では、それほどサイクル数が長くなっていません。 これは、プリフェッチがうまく機能したためと考えられます。


nice!(0)  コメント(0)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。