আমি ব্যক্তিগত চ্যালেঞ্জ হিসাবে π এর মান অর্জনের দ্রুততম উপায়টি সন্ধান করছি। আরও সুনির্দিষ্টভাবে, আমি এমন উপায়গুলি ব্যবহার করছি যা #define
ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে M_PI
কাটানো হয় না।
নীচের প্রোগ্রামটি আমার জানা বিভিন্ন উপায়ে পরীক্ষা করে। তাত্ত্বিকভাবে ইনলাইন অ্যাসেম্বলি সংস্করণটি হ'ল দ্রুততম বিকল্প, যদিও এটি স্পষ্টভাবে বহনযোগ্য নয়। অন্যান্য সংস্করণগুলির সাথে তুলনা করার জন্য আমি এটিকে বেসলাইন হিসাবে অন্তর্ভুক্ত করেছি। আমার পরীক্ষাগুলিতে, বিল্ট-ইনগুলির সাথে, 4 * atan(1)
সংস্করণটি জিসিসি ৪.২-তে দ্রুততম হয় কারণ এটি atan(1)
একটি ধ্রুবককে স্বয়ংক্রিয়ভাবে ভাঁজ করে । সঙ্গে -fno-builtin
নির্দিষ্ট atan2(0, -1)
সংস্করণ দ্রুততম হয়।
এখানে মূল পরীক্ষার প্রোগ্রাম ( pitimes.c
) রয়েছে:
#include <math.h>
#include <stdio.h>
#include <time.h>
#define ITERS 10000000
#define TESTWITH(x) { \
diff = 0.0; \
time1 = clock(); \
for (i = 0; i < ITERS; ++i) \
diff += (x) - M_PI; \
time2 = clock(); \
printf("%s\t=> %e, time => %f\n", #x, diff, diffclock(time2, time1)); \
}
static inline double
diffclock(clock_t time1, clock_t time0)
{
return (double) (time1 - time0) / CLOCKS_PER_SEC;
}
int
main()
{
int i;
clock_t time1, time2;
double diff;
/* Warmup. The atan2 case catches GCC's atan folding (which would
* optimise the ``4 * atan(1) - M_PI'' to a no-op), if -fno-builtin
* is not used. */
TESTWITH(4 * atan(1))
TESTWITH(4 * atan2(1, 1))
#if defined(__GNUC__) && (defined(__i386__) || defined(__amd64__))
extern double fldpi();
TESTWITH(fldpi())
#endif
/* Actual tests start here. */
TESTWITH(atan2(0, -1))
TESTWITH(acos(-1))
TESTWITH(2 * asin(1))
TESTWITH(4 * atan2(1, 1))
TESTWITH(4 * atan(1))
return 0;
}
এবং ইনলাইন সমাবেশের জিনিসগুলি ( fldpi.c
) যা কেবল x86 এবং x64 সিস্টেমের জন্য কাজ করবে:
double
fldpi()
{
double pi;
asm("fldpi" : "=t" (pi));
return pi;
}
এবং একটি বিল্ড স্ক্রিপ্ট যা আমি যা পরীক্ষা করে যাচ্ছি সমস্ত কনফিগারেশন তৈরি করে ( build.sh
):
#!/bin/sh
gcc -O3 -Wall -c -m32 -o fldpi-32.o fldpi.c
gcc -O3 -Wall -c -m64 -o fldpi-64.o fldpi.c
gcc -O3 -Wall -ffast-math -m32 -o pitimes1-32 pitimes.c fldpi-32.o
gcc -O3 -Wall -m32 -o pitimes2-32 pitimes.c fldpi-32.o -lm
gcc -O3 -Wall -fno-builtin -m32 -o pitimes3-32 pitimes.c fldpi-32.o -lm
gcc -O3 -Wall -ffast-math -m64 -o pitimes1-64 pitimes.c fldpi-64.o -lm
gcc -O3 -Wall -m64 -o pitimes2-64 pitimes.c fldpi-64.o -lm
gcc -O3 -Wall -fno-builtin -m64 -o pitimes3-64 pitimes.c fldpi-64.o -lm
বিভিন্ন সংকলক পতাকাগুলির মধ্যে পরীক্ষা করা ছাড়াও (iz৪-বিটের তুলনায় আমি 32-বিটের তুলনাও করেছি কারণ অপটিমাইজেশন আলাদা)), আমিও পরীক্ষার ক্রমটি স্যুইচ করার চেষ্টা করেছি। কিন্তু তবুও, atan2(0, -1)
সংস্করণটি প্রতিবার শীর্ষে আসে।