首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将C++代码转换为x87内联程序集代码

将C++代码转换为x87内联程序集代码
EN

Stack Overflow用户
提问于 2021-05-28 12:13:20
回答 1查看 141关注 0票数 0

我正在尝试将C++代码转换为x87风格的内联汇编代码。

C++代码:

代码语言:javascript
运行
复制
  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;
  }

内联汇编代码:

代码语言:javascript
运行
复制
  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
  
  }

虽然我的程序集代码可以工作,但速度非常慢。我怎样才能加快速度?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-28 12:44:15

这个有很多需要改进的地方。首先,以下是一些要点:

不要使用MSVC风格的内联程序集进行编程。

MSVC风格的内联程序集可能很容易编程,但它也强制所有变量在内存中运行。每次从变量中读取或分配变量时,都会执行缓慢的内存访问。这对性能有很大的影响。

相反,在程序集中将整个函数写入一个单独的程序集文件中。如果这是不可能的,那么至少启动程序集代码,将所有变量加载到寄存器中,然后完全在这些寄存器上进行计算,并通过将寄存器写回变量来结束汇编部分。这样,无用的数据移动量就最小化了。

当您这样做时,在程序集中实现for循环本身,这样您就不必在每次迭代时写出并读取所有变量,而是只需在整个循环中读取一次。

将尽可能多的值保存在寄存器中

如前所述,所有这些fldfstp指令都需要时间。将数字保存在寄存器中,这样您就不必不断地重新加载它们。此外,如果这是不可能的,至少将加载和存储合并到下面的指令中。例如,而不是

代码语言:javascript
运行
复制
__asm fld x 
__asm faddp st(1), st(0) 

你可以

代码语言:javascript
运行
复制
__asm fadd x

但是最好是把所有的东西都保存在寄存器里。例如,只需将c变量保持在堆栈中,就可以轻松地摆脱它。

不做两次工作

您的代码计算a*ab*b两次:一次在前一次迭代中计算norm2,一次在下一次迭代中计算c。计算这些乘积一次,并保持它们在附近,以节省两个乘数。

使用更便宜的指示,而不是更昂贵的指令。

回想一下2x =x+x,用加法替换一个常数和乘法的昂贵负载。

还记得a-b 2= (a + b)(a - b)以加法取代乘法。请注意,这可能会更改舍入,并且与“不执行两次工作”的建议不兼容。但也许它可以用于初始迭代。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67738633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档