Серия Мадхава-Лейбница в Intel x87 - PullRequest
0 голосов
/ 03 апреля 2019

Я преподаю урок по компьютерной архитектуре и готовлю примеры обработки Intel с плавающей запятой для него.Примером алгоритма является ряд Мадхавы-Лейбница, который представляет собой особенно медленный способ вычисления числа делителей на 4. (Я хорошо знаю о лучших алгоритмах, и этот достаточно медленный, чтобы легко увидеть различия в производительности.)

Есть три примера: сначала в 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
    }

Это генерирует разницу от значения c_thth.h M_PI (деленного на4) из -0.000000000029105385, поэтому я вполне уверен, что результат с точностью до десяти десятичных знаков числа Пи.Заранее благодарим за любые мысли, которые вы можете высказать!

...