SSブログ

サイクルタイムを測定しよう (4) [PSoC]このエントリーを含むはてなブックマーク#

実験回路

今回は、個別のインストラクションについて、実行サイクルを測定します。

NOP の実行サイクル

最初は、何もしない命令 "NOP" を入れてみます。 測定関数 measure() は、以下のようになりました。

uint32 measure(reg32 *reg) __attribute__((aligned(256)));
uint32 measure(reg32 *reg) {
    uint32  s;
    uint32  e;
    
    s = *reg;
    asm(
        "nop\n"
    );
    e = *reg;
    
    return e - s;
}

"asm()" を使って、インストラクションを直接入れます。 この実験では、関数の最初の部分に別の NOP 列を入れることにより配置箇所を変化させましたが、いずれの場合も5サイクルになりました。 NOP 命令が無い場合は4サイクルでしたから、 NOP 命令の実行は1サイクルであったことがわかります。

イミディエイト MOV 命令

次は、イミディエイト・アドレッシングモードの MOV 命令を入れてみます。 Cortex-M0 では、8ビットで表現できる値をレジスタに入れるイミディエイト・アドレッシングモードの MOV 命令があります。

    s = *reg;
    asm(
        "mov r3,#170\n"
    );
    e = *reg;

この命令で CPU の r3 レジスタに170という値を入れます。 値に意味はありません。 また、使用したレジスタも他の部分に影響のないものという事で r3 を選んでいます。 実験の結果、 NOP の場合と同様にすべて5サイクルとなりました。 この命令も1サイクルで実行されます。

かけ算命令 MUL の場合

三つ目は、かけ算命令 MUL を実行してみます。

    s = *reg;
    asm(
        "mul r3,r0\n"
    );
    e = *reg;

ここで実行しているかけ算の内容にも意味はありません。 実験の結果は、これも5サイクルになりました。 かけ算も1サイクルで実行してしまいます。

メモリアクセスさえ無ければ

以上のように、メモリアクセスの無い命令であれば、ほとんど1サイクルで実行する事が出来ます。 しかし、実行順序に影響を与える場合には、そうはいきません。


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

nice! 0

コメント 0

コメントを書く

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

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。