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 上,您的代码都不会完成很多工作,因为单个 pld 只会加载单个缓存行(32-64 字节);它不会告诉 CPU 在那之后永远保持预取行。pld 指令的有效用法是在循环迭代中发出它,以便它指向当前加载位置之前的多个缓存行。理想情况下,您会构建循环,以便每个 pld 完成一个缓存行的负载,以避免冗余。此外,您还可以将数据集与缓存线宽对齐。

但是,Cortex-A9 有一个自动预取器,可以检测步幅。如果您使用的是 Cortex-A9 并且启用了此功能,则 pld 可能没有太大帮助或根本没有帮助,反而只会浪费时间通过管道。

于 2011-06-02T19:18:26.887 回答