【发布时间】:2021-08-16 16:30:36
【问题描述】:
我正在尝试将 C++ 代码转换为 x87 样式的内联汇编代码。
C++ 代码:
double a = 0.0, b = 0.0, norm2 = 0.0;
int n;
for (n = 0; norm2 < 4.0 && n < N; ++n) {
double c = a*a - b*b + x;
b = 2.0*a*b + y;
a = c;
norm2 = a*a + b*b;
}
内联汇编代码:
double a = 0.0, b = 0.0, norm2 = 0.0;
int n;
for (n = 0; norm2 < 4.0 && n < N; ++n) {
// double c = a * a - b * b + x;
__asm fld a
__asm fmul st(0), st(0)
__asm fld b
__asm fmul st(0), st(0)
__asm fsubp st(1), st(0)
__asm fld x
__asm faddp st(1), st(0)
__asm fstp c
// b = 2.0 * a * b + y;
__asm fld two
__asm fld b
__asm fld a
__asm fmulp st(2), st(0)
__asm fmulp st(1), st(0)
__asm fld y
__asm faddp st(1), st(0)
__asm fstp b
// a = c
__asm fld c
__asm fstp a
//norm2 = a * a + b * b;
__asm fld a
__asm fmul st(0), st(0)
__asm fld b
__asm fmul st(0), st(0)
__asm faddp st(1), st(0)
__asm fstp norm2
}
虽然我的汇编代码可以工作,但速度很慢。如何加快速度?
【问题讨论】:
-
找到一个支持你的平台的编译器并让它生成优化的代码,然后比较两者。
-
众所周知,这种内联汇编方式效率低下,因为需要大量重新加载。尝试完全在汇编中编写汇编函数,而不是使用内联汇编。
-
@RichardCritten 我尝试使用godbolt,但我不太明白。我无法复制和粘贴并运行 Godbolt 的输出
-
更好的问题,使用优化编译器编译时原始代码会变慢吗?你需要组装吗?特别是x87?这是您应用程序的瓶颈吗?
-
是的,我需要组装,是的 x87。它是项目规范的一部分。原始代码现在比我的汇编代码快。我希望它至少具有相同的速度
标签: c++ assembly inline-assembly x87