2

次のプログラムを使用して、PLDパフォーマンスへの影響を確認しています。しかし、私PLDが書いた C コードがある場合とない場合のパフォーマンスの違いを見つけることができませんでした。不足しているものや、追加する必要のあるコンパイラ オプションはありますか?

int arra[6144] = {0};      /*15kb*/
int arrb[6144] = {0};       /*15kb*/
int arrc[6144] = {0};       /*15kb*/
int arrd[2048] = {0};      /*5kb*/
int arre[2048] = {0};       /*5kb*/
int arrf[2048] = {0};       /*5kb*/
int arrg[2048] = {0};      /*5kb*/
int arrh[2048] = {0};       /*5kb*/
int arri[2048] = {0};       /*5kb*/
int arrj[2048] = {0};      /*5kb*/
int arrk[2048] = {0};       /*5kb*/
int arrl[2048] = {0};       /*5kb*/




int main()
{
    int csize;
    int i,z = 3;
    int loop_i;
    int32x4_t viarrd,viarre,viarrf;
    int32x4_t viarrg,viarrh,viarri;
    int32x4_t viarrj,viarrk,viarrl;

    asm("LDR r1, =arrd");
    asm("LDR r2, =arre");
    asm("LDR r3, =arrf");
    asm("LDR r4, =arrg");
    asm("LDR r5, =arrh");

          asm ("PLD [r1]");
    asm ("PLD [r2]");
    asm ("PLD [r3]");
    asm ("PLD [r4]");
    asm ("PLD [r5]");

for(loop_i=0;loop_i<100;loop_i++)
{
    for(i=0;i<2048;i++)
    {

        arrd[i] = 5;
        arre[i] = 5;
        arrf[i] = 5;
        arrg[i] = 5;
        arrh[i] = 5;
        arri[i] = 5;
        arrj[i] = 5;
        arrk[i] = 5;
        arrl[i] = 5;
    }

    for(i=0;i<2048;i+=4)
    {
        viarrf = vld1q_s32(&arrf[i]);
        viarre = vld1q_s32(&arre[i]);
        viarrd = vmulq_s32(viarrf,viarre);
        vst1q_s32(&arrd[i],viarrd);
    }
    for(i=0;i<2048;i+=4)
    {
        viarrg = vld1q_s32(&arrg[i]);
        viarrh = vld1q_s32(&arrh[i]);
        viarri = vmulq_s32(viarrg,viarrh);
        vst1q_s32(&arri[i],viarri);
    }
    for(i=0;i<2048;i+=4)
    {
        viarrj = vld1q_s32(&arrj[i]);
        viarrk = vld1q_s32(&arrk[i]);
        viarrl = vmulq_s32(viarrj,viarrk);
        vst1q_s32(&arrl[i],viarrl);
    }
    for(i=0;i<2048;i+=4)
    {
        viarrd = vld1q_s32(&arrd[i]);
        viarrf = vld1q_s32(&arrf[i]);
        viarre = vmulq_s32(viarrd,viarrf);
        vst1q_s32(&arre[i],viarre);
    }
    for(i=0;i<2048;i+=4)
    {
        viarrg = vld1q_s32(&arrg[i]);
        viarri = vld1q_s32(&arri[i]);
        viarrh = vmulq_s32(viarrg,viarri);
        vst1q_s32(&arrh[i],viarrh);
    }
}
4

1 に答える 1

2

あなたの説明には Cortex-A9 と書かれていますが、タグには Cortex-A8 と書かれています - どちらですか? Cortex-A8 では pld は L2 にのみロードされ、データ セットは既に L2 に収まっています。

とはいえ、Cortex-A8 または A9 上にあるかどうかにかかわらず、コードはそれほど多くのことを達成しません。その後、行を永久にプリフェッチし続けるように CPU に指示することはありません。pld 命令の効果的な使用法は、現在ロード元の場所より先に複数のキャッシュ ラインを指すようにループ反復内で発行することです。理想的には、冗長なロードを避けるために、1 つのキャッシュ ライン分のロードが pld ごとに実行されるようにループを構成します。また、データ セットをキャッシュ ライン幅に合わせます。

ただし、Cortex-A9 にはストライドを検出する自動プリフェッチャーがあります。Cortex-A9 を使用していて、この機能がオンになっている場合、pld はあまり役に立たないか、まったく役に立たず、代わりにパイプラインを通過する時間を無駄にするだけです。

于 2011-06-02T19:18:26.887 に答える