【问题标题】:Memory Size Load and Store penalty analysis?内存大小加载和存储惩罚分析?
【发布时间】:2014-12-01 18:03:32
【问题描述】:

使用 ocount 分析代码会显示更多的循环惩罚开启和更少的循环惩罚关闭。我试图理解为什么惩罚标志打开时会有更多的惩罚?

uint16_t arr[1010];
uint32_t r[500];


void func()
{     
            uint32_t i = 0;


            for (i = 0; i < 1000; i+=2)
            {
                arr[i] = i;
                arr[i+1] = i+10;
        #ifdef PENALTY_ON

               r[i/2] = *(uint32_t *)((uint16_t *)&arr[i+1]);
        #endif
            }
        #ifndef PENALTY_ON
            for (i = 0; i < 1000; i+=2)
            {
                r[i/2] = *(uint32_t *)((uint16_t *)&arr[i+1]);
            }
        #endif
 }

【问题讨论】:

  • 猜测,预取?如果没有惩罚,您可以不中断地预取整个 arr 数组。
  • 所有这些演员表都是必要的吗?它们非常嘈杂和分散注意力。目前还不清楚是否可以有意义地讨论未定义行为的表现。
  • 实际上是模拟它的人做到了。我也在质疑这里所做的演员表。
  • 你在什么处理器架构上运行代码?

标签: c pointers memory casting cpu-cycles


【解决方案1】:

在带有 -O3 的 32 位机器上使用 gcc 编译两者

使用 PENALTY_ON

00000000 <func>:
0:  31 c0                   xor    %eax,%eax
2:  8d b6 00 00 00 00       lea    0x0(%esi),%esi
8:  8d 50 0a                lea    0xa(%eax),%edx
b:  66 89 94 00 02 00 00    mov    %dx,0x2(%eax,%eax,1)
12: 00 
13: 8b 8c 00 02 00 00 00    mov    0x2(%eax,%eax,1),%ecx
1a: 89 c2                   mov    %eax,%edx
1c: 66 89 84 00 00 00 00    mov    %ax,0x0(%eax,%eax,1)
23: 00 
24: 83 c0 02                add    $0x2,%eax
27: d1 ea                   shr    %edx
29: 3d e8 03 00 00          cmp    $0x3e8,%eax
2e: 89 0c 95 00 00 00 00    mov    %ecx,0x0(,%edx,4)
35: 75 d1                   jne    8 <func+0x8>
37: f3 c3                   repz ret  

没有 PENALTY_ON

00000000 <func>:
0:  31 c0                   xor    %eax,%eax
2:  8d b6 00 00 00 00       lea    0x0(%esi),%esi
8:  8d 50 0a                lea    0xa(%eax),%edx
b:  66 89 84 00 00 00 00    mov    %ax,0x0(%eax,%eax,1)
12: 00 
13: 66 89 94 00 02 00 00    mov    %dx,0x2(%eax,%eax,1)
1a: 00 
1b: 83 c0 02                add    $0x2,%eax
1e: 3d e8 03 00 00          cmp    $0x3e8,%eax
23: 75 e3                   jne    8 <func+0x8>
25: 66 31 c0                xor    %ax,%ax
28: 8b 8c 00 02 00 00 00    mov    0x2(%eax,%eax,1),%ecx
2f: 89 c2                   mov    %eax,%edx
31: 83 c0 02                add    $0x2,%eax
34: d1 ea                   shr    %edx
36: 3d e8 03 00 00          cmp    $0x3e8,%eax
3b: 89 0c 95 00 00 00 00    mov    %ecx,0x0(,%edx,4)
42: 75 e4                   jne    28 <func+0x28>
44: f3 c3                   repz ret 

我认为原因是 PENALTY_ON 发生 Read-after-Write 停顿

b:  66 89 94 00 02 00 00    mov    %dx,0x2(%eax,%eax,1)
12: 00 
13: 8b 8c 00 02 00 00 00    mov    0x2(%eax,%eax,1),%ecx

【讨论】:

  • 可能就是这样。是存储加载转发问题吗?
  • 是的,我相信是的。据我了解,存储到加载转发需要对齐匹配。
猜你喜欢
  • 2015-04-27
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
  • 2013-09-14
相关资源
最近更新 更多