PLD在皮质A9中没有影响

时间:2011-03-14 09:34:26

标签: arm neon cortex-a

我使用以下程序检查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 个答案:

答案 0 :(得分:2)

您的描述是说Cortex-A9,但标签上写着Cortex-A8 - 这是什么?在Cortex-A8上,pld只加载到L2,你的数据集已经适合L2,所以如果它已经存在,那么它就不会从预加载中受益。

也就是说,无论是否在Cortex-A8或A9上,您的代码都无法完成,因为单个pld只会加载一个缓存行(32-64字节);它不会告诉CPU永远保留预取线。 pld指令的有效用法是在循环迭代中发出它,使其在您当前加载的位置之前指向多个缓存行。理想情况下,您需要构建循环,以便每个pld完成一个缓存行的负载值,以避免冗余。此外,您还要将数据集与高速缓存行宽对齐。

但是,Cortex-A9有一个可以检测步幅的自动预取器。如果您使用的是Cortex-A9并且此功能已打开,那么pld可能没有太大帮助,或者根本不会浪费时间通过管道。