Intel x87中的Madhava-Leibniz系列

时间:2019-04-03 17:34:39

标签: assembly intel x87

我教计算机架构课程,并为此准备Intel i7浮点处理的示例。示例算法是Madhava-Leibniz系列,这是计算pi除以4的一种特别慢的方法。(我很清楚更好的算法,这种算法足够慢,很容易看到性能差异。)

有3个示例:首先是C ++,接下来是x87浮点处理器,最后是使用AVX512指令集。

对于x87示例,我想了解以下代码是否相当有效。 (我知道MMX / SSE / AVX指令会更快,我们也会显示这些指令。)它被编码为Visual Studio 2017中的内联程序集。

C ++变量为:double term1 = 3.0,term2 = 5.0,workSum = 1.0,d4 = 4.0;

我征求您意见的代码是:

    __asm {
        finit;  // Initialize x87
        fld1;   // starting value for result
        fld d4; // term increment amount for each loop iteration
        fld term2;  // starting second term (5)
        fld  term1; // starting first term (3)
        mov ecx,UINT_MAX    // loop limit
    LiebnizLoop: fld1;
        fdiv ST(0), ST(1);  // 1 / term1
        fld  ST(4)  // current result value
        fsub ST(0),ST(1)    // subtract 1 / term1
        fld1;   
        fdiv ST(0), ST(4);  // 1 / term2
        fadd ST(0), ST(1);  // add to current result value
        fstp ST(6); // save back
        ; // Logic to increment terms and continue loop
        fstp st(0); // pop st(0) to itself and delete;
        fstp st(0); 
        fld ST(2);  // get increment (4)
        fadd ST(0), ST(1);  // add to term1
        fst ST(1);  // save updated term 1
        fld ST(2);  // get term 2
        fadd ST(0),ST(4)    // add increment (4)
        fst ST(3);  // save updated term 2
        fstp st(0); // pop st(0) to itself and delete;
        fstp st(0); 
        loop LiebnizLoop    // loop
        fstp term1; // save ending term1, delete term2 and the increment
        fstp st(0); // 
        fstp st(0); // 
        fstp workSum; // save final result
    }

这与-0.000000000029105385的cmath.h M_PI值(除以4)产生了差异,因此,我可以确定结果精确到pi的十进制小数。 预先感谢您提供的任何想法!

0 个答案:

没有答案