Я преподаю урок по компьютерной архитектуре и готовлю примеры обработки 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, поэтому я вполне уверен, что результат с точностью до десяти десятичных знаков числа Пи.Заранее благодарим за любые мысли, которые вы можете высказать!