অস্বীকৃত ভাসমান পয়েন্টের বিশ্বে স্বাগতম ! পারফরম্যান্সে তারা সর্বনাশ করতে পারে !!!
ডেনোরমাল (বা সাবমনোরাল) নম্বরগুলি হ্যাকের ধরণ যা ভাসমান পয়েন্ট উপস্থাপনের বাইরে শূন্যের খুব কাছাকাছি কিছু অতিরিক্ত মান পেতে। ডেনরমালাইজড ফ্লোটিং-পয়েন্টে অপারেশনগুলি দশমিক থেকে কয়েকগুণ ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে কমবে। এটি কারণ অনেক প্রসেসর তাদের সরাসরি পরিচালনা করতে পারে না এবং মাইক্রোকোড ব্যবহার করে তাদের ফাঁদে ফেলে সমাধান করতে হবে।
আপনি 10,000 পুনরাবৃত্তিও পর সংখ্যার প্রিন্ট আউট থাকেন তবে আপনি সেই তারা কিনা নির্ভর করে বিভিন্ন মান converged আছে দেখতে হবে 0
বা 0.1
ব্যবহার করা হয়।
এখানে এক্স কোডে সংকলিত পরীক্ষার কোডটি রয়েছে:
int main() {
double start = omp_get_wtime();
const float x[16]={1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.1,2.2,2.3,2.4,2.5,2.6};
const float z[16]={1.123,1.234,1.345,156.467,1.578,1.689,1.790,1.812,1.923,2.034,2.145,2.256,2.367,2.478,2.589,2.690};
float y[16];
for(int i=0;i<16;i++)
{
y[i]=x[i];
}
for(int j=0;j<9000000;j++)
{
for(int i=0;i<16;i++)
{
y[i]*=x[i];
y[i]/=z[i];
#ifdef FLOATING
y[i]=y[i]+0.1f;
y[i]=y[i]-0.1f;
#else
y[i]=y[i]+0;
y[i]=y[i]-0;
#endif
if (j > 10000)
cout << y[i] << " ";
}
if (j > 10000)
cout << endl;
}
double end = omp_get_wtime();
cout << end - start << endl;
system("pause");
return 0;
}
আউটপুট:
#define FLOATING
1.78814e-007 1.3411e-007 1.04308e-007 0 7.45058e-008 6.70552e-008 6.70552e-008 5.58794e-007 3.05474e-007 2.16067e-007 1.71363e-007 1.49012e-007 1.2666e-007 1.11759e-007 1.04308e-007 1.04308e-007
1.78814e-007 1.3411e-007 1.04308e-007 0 7.45058e-008 6.70552e-008 6.70552e-008 5.58794e-007 3.05474e-007 2.16067e-007 1.71363e-007 1.49012e-007 1.2666e-007 1.11759e-007 1.04308e-007 1.04308e-007
//#define FLOATING
6.30584e-044 3.92364e-044 3.08286e-044 0 1.82169e-044 1.54143e-044 2.10195e-044 2.46842e-029 7.56701e-044 4.06377e-044 3.92364e-044 3.22299e-044 3.08286e-044 2.66247e-044 2.66247e-044 2.24208e-044
6.30584e-044 3.92364e-044 3.08286e-044 0 1.82169e-044 1.54143e-044 2.10195e-044 2.45208e-029 7.56701e-044 4.06377e-044 3.92364e-044 3.22299e-044 3.08286e-044 2.66247e-044 2.66247e-044 2.24208e-044
দ্বিতীয় রানটিতে কীভাবে সংখ্যাগুলি শূন্যের খুব কাছাকাছি রয়েছে তা নোট করুন।
অস্বীকৃতিযুক্ত সংখ্যাগুলি সাধারণত বিরল এবং সুতরাং বেশিরভাগ প্রসেসর এগুলি দক্ষতার সাথে পরিচালনা করার চেষ্টা করেন না।
এটিকে কোডের শুরুতে যুক্ত করে ডেনারমালগুলি শূন্যে ফেলা হলে ডেনারমালাইজড সংখ্যার সাথে এর সম্পর্কযুক্ত রয়েছে তা দেখাতে :
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
তারপরে সংস্করণটি 0
আর 10x ধীর হয় না এবং আসলে দ্রুত হয়। (এটির জন্য এসএসই সক্ষম হওয়া কোডটি সংকলন করা দরকার))
এর অর্থ এই যে প্রায় অল্প শূন্য মানের এই অদ্ভুত নিম্নতর নির্ভুলতা ব্যবহার করার পরিবর্তে আমরা কেবল শূন্যের পরিবর্তে গোল করব।
সময়: কোর আই 7920 @ 3.5 গিগাহার্টজ:
// Don't flush denormals to zero.
0.1f: 0.564067
0 : 26.7669
// Flush denormals to zero.
0.1f: 0.587117
0 : 0.341406
শেষ পর্যন্ত, এটি কোনও পূর্ণসংখ্যা বা ভাসমান-পয়েন্ট কিনা তা দিয়ে আসলেই এর কোনও সম্পর্ক নেই। 0
বা 0.1f
রূপান্তরিত / উভয় loops একটি রেজিস্টার বাহিরে মধ্যে সংরক্ষিত হয়। সুতরাং এটির পারফরম্যান্সে কোনও প্রভাব নেই।