7

Exynos 3110 プロセッサ (1 GHz シングルコア ARM Cortex-A8、たとえば Nexus S で使用) を使用しており、特定の機能の実行時間を測定しようとしています。Nexus SでAndroid 4.0.3を実行しています。次の方法を試しました

[1] ARM Cortex-A8 プロセッサでプログラムの実行時間を測定する方法は?

カーネル モジュールをロードして、ユーザー モードでレジスタ値を読み取れるようにしました。次のプログラムを使用してカウンターをテストしています。

static inline unsigned int get_cyclecount (void)
{
    unsigned int value;
    // Read CCNT Register
    asm volatile ("MRC p15, 0, %0, c9, c13, 0\t\n": "=r"(value));
    return value;
}


static inline void init_perfcounters (int do_reset, int enable_divider)
{
    // in general enable all counters (including cycle counter)
    int value = 1;

    // peform reset:  
    if (do_reset)
    {
        value |= 2;     // reset all counters to zero.
        value |= 4;     // reset cycle counter to zero.
    } 

    if (enable_divider)
        value |= 8;     // enable "by 64" divider for CCNT.

    value |= 16;

    // program the performance-counter control-register:
    asm volatile ("MCR p15, 0, %0, c9, c12, 0\t\n" :: "r"(value));  

    // enable all counters:  
    asm volatile ("MCR p15, 0, %0, c9, c12, 1\t\n" :: "r"(0x8000000f));  

    // clear overflows:
    asm volatile ("MCR p15, 0, %0, c9, c12, 3\t\n" :: "r"(0x8000000f));
}


int main(int argc, char **argv)
{
    int i = 0;
    unsigned int start = 0;
    unsigned int end = 0;

    printf("Hello Counter\n");

    init_perfcounters(1,0);

    for(i=0;i<10;i++)
    {
        start = get_cyclecount();
        sleep(1); // sleep one second
        end = get_cyclecount();

        printf("%u %u %u\n", start, end, end - start);
    }

    return 0;
}

[1] によると、カウンタはクロック サイクルごとにインクリメントされます。scaling_governor をユーザー空間に切り替え、CPU 周波数を 1GHz に設定して、Android によってクロック周波数が変更されないようにしました。

プログラムを実行すると、1 秒のスリープが実行されますが、カウンターの値は、予想される 1e9 ではなく、~200e6 の範囲にあります。ここで欠けているプロセッサ固有のものはありますか? カウンタのクロック レートは、プロセッサのクロック レートと異なりますか?

4

2 に答える 2

1

この教授のページをチェックしてください:http://users.ece.utexas.edu/~valvano/arm/ 彼は、time / periodic-timers/measuring-execution-timeに関係する複数の完全なサンプルプログラムを持っています。 ARMCortex-M3ベースのマイクロコントローラー。これがあなたが取り組んでいるものとそれほど変わらないことを願っています。Performance.cに興味があると思います

于 2012-04-23T05:27:03.030 に答える
0

ガバナーは、標準の Linux と同じようにパフォーマンス管理のために Android で使用されますか? また、カスタムの Android イメージを使用していますか、それともメーカーから提供されたものを使用していますか? 製造元が提供するイメージには、低レベルのポリシーが適用されていると思います (スリープやモデムのアクティビティなどに関連付けられています)。スリープ コードが電圧と周波数を直接スケーリングすることも考えられます。ポリシー (またはガバナー) だけでなく、CPUFreq 全体を無効にする価値があるかもしれません。

于 2013-12-09T07:39:34.067 に答える