我使用以下程序检查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);
}
}
答案 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可能没有太大帮助,或者根本不会浪费时间通过管道。