如何手动对浮点除法执行强度削减优化(基于IEEE 754)
浮点除法语义循环的强度削减优化问题
- 本学期计算机科学课程期末作业要求对多段代码片段执行强度削减优化,大部分片段结合编译器输出即可直接完成,唯独有一段代码即使参考编译器输出也无法定位优化思路。
- 授课教授给出的提示为:需了解IEEE 754单精度浮点数在内存中的表示方式。
待优化的代码片段如下(其中a的类型为double*):
for (int i = 0; i < N; ++i) { a[i] += i / 5.3; }
已开展的排查工作
首先在编译实验平台查看了该代码片段的不同优化等级编译输出,分别提取了循环内的相关汇编段:
- 无优化编译下循环内汇编(已标注除法相关指令):
mov eax, DWORD PTR [rbp-4] cdqe lea rdx, [0+rax*8] mov rax, QWORD PTR [rbp-16] add rax, rdx movsd xmm1, QWORD PTR [rax] cvtsi2sd xmm0, DWORD PTR [rbp-4] // 除法相关指令 movsd xmm2, QWORD PTR .LC0[rip] // 除法相关指令 divsd xmm0, xmm2 // 除法相关指令 mov eax, DWORD PTR [rbp-4] cdqe lea rdx, [0+rax*8] mov rax, QWORD PTR [rbp-16] add rax, rdx addsd xmm0, xmm1 movsd QWORD PTR [rax], xmm0
-O3优化等级下的汇编输出:
.L2: pshufd xmm0, xmm2, 238 // 除法相关指令 cvtdq2pd xmm1, xmm2 // 除法相关指令 movupd xmm6, XMMWORD PTR [rax] add rax, 32 cvtdq2pd xmm0, xmm0 // 除法相关指令 divpd xmm1, xmm3 // 除法相关指令 movupd xmm5, XMMWORD PTR [rax-16] paddd xmm2, xmm4 divpd xmm0, xmm3 // 除法相关指令 addpd xmm1, xmm6 movups XMMWORD PTR [rax-32], xmm1 addpd xmm0, xmm5 movups XMMWORD PTR [rax-16], xmm0 cmp rax, rbp jne .L2
高优化等级下编译器叠加了循环展开、SIMD向量化等多层优化逻辑,无法直接从汇编结果反推该片段的强度削减实现思路。后续尝试手动分析浮点常量5.3的IEEE 754比特位表示结构:
0 |10000001|01010011001100110011010 符号位|指数位 |尾数位
即符号位为0、指数位为10000001、尾数位为01010011001100110011010,但仍未找到可行的优化方案,现咨询该浮点除法强度削减的具体实现方法。
内容的提问来源于stack exchange,提问作者Zagatho
相关产品推荐
相关产品推荐

