отсутствие эффекта PLD в коре головного мозга A9 - PullRequest
2 голосов
/ 14 марта 2011

Я использую следующую программу для проверки влияния 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);
    }
}

1 Ответ

2 голосов
/ 02 июня 2011

В вашем описании написано Cortex-A9, а в теге указано Cortex-A8 - что это? На Cortex-A8 pld загружается только в L2, и ваш набор данных уже помещается в L2, поэтому, если он уже там, он не получит выгоду от предварительной загрузки.

Тем не менее, ваш код не будет выполнять очень много, независимо от того, находится он на Cortex-A8 или A9, потому что один pld будет загружать только одну строку кэша (32-64 байта); он не скажет процессору о том, что после этого он будет всегда сохранять строки для предварительной выборки. Эффективное использование инструкции pld состоит в том, чтобы выполнить ее внутри итерации цикла так, чтобы она указывала на несколько строк кэша впереди того места, откуда вы сейчас загружаете. В идеале вы должны структурировать свой цикл таким образом, чтобы нагрузка на одну строку кэша выполнялась на pld, чтобы избежать избыточных. Кроме того, вы должны выровнять свои наборы данных по ширине строки кэша.

Тем не менее, Cortex-A9 имеет автоматический предварительный выборщик, который обнаруживает шаги. Если вы работаете на Cortex-A9, и эта функция включена, pld может не сильно помочь или вообще поможет, а просто потратит время на прохождение конвейера.

...