【发布时间】:2016-10-19 10:02:48
【问题描述】:
简单的 MWE:
int* ptr = (int*)malloc(64 * sizeof(int));
_mm_prefetch((const char*)(ptr + 64), _MM_HINT_0);
- 这是已定义的行为还是未定义的行为?
- 这会引发信号并中止程序运行吗?
我之所以问,是因为我可以在编译器生成的代码中看到这样的预取,在循环中预取是在不检查地址的情况下完成的(存储在 rbx 中):
400e73: 49 83 c5 40 add r13,0x40
400e77: 62 f1 f9 08 28 03 vmovapd zmm0,ZMMWORD PTR [rbx]
400e7d: 4d 3b ec cmp r13,r12
400e80: 62 d1 f9 08 eb 4d ff vporq zmm1,zmm0,ZMMWORD PTR [r13-0x40]
400e87: 90 nop
400e88: 62 d1 78 08 29 4d ff vmovaps ZMMWORD PTR [r13-0x40],zmm1
400e8f: 72 03 jb 400e94 <main+0x244>
400e91: 49 89 c5 mov r13,rax
400e94: 62 f1 78 08 18 53 1d vprefetch1 [rbx+0x740]
400e9b: ff c1 inc ecx
400e9d: 62 f1 78 08 18 4b 02 vprefetch0 [rbx+0x80]
400ea4: 48 83 c3 40 add rbx,0x40
400ea8: 81 f9 00 00 10 00 cmp ecx,0x100000
400eae: 72 c3 jb 400e73 <main+0x223>
【问题讨论】:
-
你看过文档了吗?
-
英特尔内部指南没有说明任何内容。也不是英特尔内部参考。也不是英特尔至强融核指令集参考(反汇编代码是为 KNC 编译的)。据我所知。我在每个程序员都应该知道的关于内存的知识中只找到了这句话:程序可以在程序中的任何指针上使用 _mm_prefetch 内在函数。大多数处理器(当然是所有 x86 和 x86-64 处理器)都会忽略无效指针导致的错误,从而大大简化程序员的工作。
-
好点。感谢您在问这个问题之前先看看。有趣的是,如此重要的细节仍未记录在案!
-
请注意:至强融核指令集参考未列出
VPREFETCHx的页面错误 (PF) 异常。对于具有内在函数的通用编程,因此应该通过检查所有可能架构的指令引用来找到答案。
标签: c caching assembly disassembly prefetch