এসএসই স্কেলার স্কয়ার্ট (এক্স) আরএসকিআরটি (এক্স) * এক্স এর চেয়ে ধীর?


106

আমি আমাদের মূল গণিতের কিছুটি একটি ইন্টেল কোর ডুওয়ের উপর লিখছি, এবং বর্গমূলের বিভিন্ন পদ্ধতির দিকে তাকানোর সময় আমি কিছু অদ্ভুত কিছু লক্ষ্য করেছি: এসএসই স্কেলার অপারেশনগুলি ব্যবহার করে, একটি পারস্পরিক স্কোয়ার রুট গ্রহণ করা এবং এটির সংখ্যাবৃদ্ধি করা আরও দ্রুত স্কয়ার্টটি পাওয়ার জন্য এটি দেশীয় স্কয়ার্ট অপকোড ব্যবহারের চেয়ে বেশি!

আমি এটির মতো লুপ দিয়ে এটি পরীক্ষা করছি:

inline float TestSqrtFunction( float in );

void TestFunc()
{
  #define ARRAYSIZE 4096
  #define NUMITERS 16386
  float flIn[ ARRAYSIZE ]; // filled with random numbers ( 0 .. 2^22 )
  float flOut [ ARRAYSIZE ]; // filled with 0 to force fetch into L1 cache

  cyclecounter.Start();
  for ( int i = 0 ; i < NUMITERS ; ++i )
    for ( int j = 0 ; j < ARRAYSIZE ; ++j )
    {
       flOut[j] = TestSqrtFunction( flIn[j] );
       // unrolling this loop makes no difference -- I tested it.
    }
  cyclecounter.Stop();
  printf( "%d loops over %d floats took %.3f milliseconds",
          NUMITERS, ARRAYSIZE, cyclecounter.Milliseconds() );
}

আমি এটি টেস্টস্করণ ফাংশনের জন্য কয়েকটি পৃথক সংস্থা নিয়ে চেষ্টা করেছি এবং আমার এমন কিছু সময় পেয়েছে যা সত্যিই আমার মাথা আঁচড়ে যাচ্ছে। এখন পর্যন্ত সবচেয়ে খারাপটি হ'ল দেশীয় স্কয়ার্ট () ফাংশনটি ব্যবহার করা এবং "স্মার্ট" সংকলকটিকে "অনুকূলিতকরণ" দেওয়া। 24ns / ফ্লোটে, x87 এফপিইউ ব্যবহার করে এটি করুণভাবে খারাপ হয়েছিল:

inline float TestSqrtFunction( float in )
{  return sqrt(in); }

পরেরটি আমি যা চেষ্টা করেছি তা হ'ল সংকলককে এসএসই এর স্কেলার স্কয়ার্ট অপকোড ব্যবহার করতে বাধ্য করার জন্য:

inline void SSESqrt( float * restrict pOut, float * restrict pIn )
{
   _mm_store_ss( pOut, _mm_sqrt_ss( _mm_load_ss( pIn ) ) );
   // compiles to movss, sqrtss, movss
}

এটি 11.9ns / ফ্লোটে ভাল ছিল। আমি কারম্যাকের ন্যাক্কারজনক নিউটন-র‌্যাফসন আনুমানিক কৌশলটিও চেষ্টা করেছিলাম , যা হার্ডওয়্যার থেকেও আরও ভালভাবে চলেছিল, ৪.৩ এনএস / ফ্লোটে, যদিও 2 10-এ 1 এর ত্রুটি ছিল (এটি আমার উদ্দেশ্যগুলির জন্য খুব বেশি))

ডুজিটি ছিল যখন আমি পারস্পরিক বর্গমূলের জন্য এসএসই অপ্ট চেষ্টা করেছিলাম এবং এর পরে বর্গমূল (x * 1 / √x = √x) পেতে বহুগুণ ব্যবহার করি। যদিও এটি দুটি নির্ভরশীল অপারেশন গ্রহণ করে, এটি খুব দ্রুত সমাধান ছিল 1.24ns / ফ্লোটে এবং 2 -14-এ সঠিক :

inline void SSESqrt_Recip_Times_X( float * restrict pOut, float * restrict pIn )
{
   __m128 in = _mm_load_ss( pIn );
   _mm_store_ss( pOut, _mm_mul_ss( in, _mm_rsqrt_ss( in ) ) );
   // compiles to movss, movaps, rsqrtss, mulss, movss
}

আমার প্রশ্ন মূলত কি দেয় ? অন্য দুটি গণিত ক্রিয়াকলাপের মধ্যে এসএসই-র অন্তর্নির্মিত হার্ডওয়্যার স্কোয়ার রুটটি সিন্থেসাইজ করার চেয়ে ধীর কেন?

আমি নিশ্চিত যে এটি সত্যই অপের নিজের জন্য ব্যয়, কারণ আমি যাচাই করেছি:

  • সমস্ত ডেটা ক্যাশে ফিট করে এবং অ্যাক্সেসগুলি ক্রমযুক্ত হয়
  • কার্যাদি অন্তর্ভুক্ত করা হয়
  • লুপটি আনলোল করা কোনও তাত্পর্যপূর্ণ করে না
  • সংকলক পতাকাগুলি সম্পূর্ণ অপ্টিমাইজেশনে সেট করা আছে (এবং সমাবেশটি ভাল, আমি পরীক্ষা করেছি)

( সম্পাদনা : স্টেফেনটিরোন সঠিকভাবে উল্লেখ করেছে যে সংখ্যার দীর্ঘ স্ট্রিংয়ের ক্রিয়াকলাপগুলিতে ভেক্টরাইজিং সিমড প্যাকড অপস ব্যবহার করা উচিত, যেমন rsqrtps- তবে এখানে অ্যারের ডেটা স্ট্রাকচারটি কেবল পরীক্ষার উদ্দেশ্যেই হয়: আমি যা চেষ্টা করতে চাইছি তা কোডে ব্যবহারের জন্য স্কেলার পারফরম্যান্স) এটি ভেক্টরাইজ করা যাবে না))


13
x / sqrt (x) = স্কয়ার্ট (এক্স)। অথবা, অন্য কোনও উপায়ে রাখুন: x ^ 1 * x ^ (- 1/2) = x ^ (1 - 1/2) = x ^ (1/2) =
স্ক্রুট

6
অবশ্যই inline float SSESqrt( float restrict fIn ) { float fOut; _mm_store_ss( &fOut, _mm_sqrt_ss( _mm_load_ss( &fIn ) ) ); return fOut; },। তবে এটি একটি খারাপ ধারণা কারণ এটি সিপিইউ স্ট্যাকটিতে ভাসা লিখলে সহজেই লোড-হিট-স্টোর স্টলকে প্ররোচিত করতে পারে এবং তাৎক্ষণিকভাবে সেগুলি আবার পড়তে পারে - বিশেষত ফেরতের মূল্যের জন্য ভেক্টর রেজিস্টার থেকে ফ্ল্যাট রেজিস্টারে জাগলিং খারাপ খবর। এছাড়াও, অন্তর্নিহিত মেশিনটি অপকড করে যে এসএসই অভ্যন্তরীণভাবে যেভাবেই অ্যাড্রেস অপারেন্ডকে উপস্থাপন করে।
ক্র্যাশওয়ার্ক

4
এলএইচএসের বিষয়টি কতটা নির্দিষ্ট জেন এবং প্রদত্ত x86 এর পদক্ষেপের উপর নির্ভর করে: আমার অভিজ্ঞতা হ'ল i7 অবধি যে কোনও বিষয়ে, রেজিস্টার সেটগুলির মধ্যে ডেটা মুভিং (যেমন এফপিইউ থেকে এসএসই থেকে eax) খুব খারাপ, যখন এক্সএমএম 0 এবং স্ট্যাকের মধ্যে একটি বৃত্তাকার ট্রিপ হয় between এবং ফিরে নয়, কারণ ইন্টেলের স্টোর-ফরোয়ার্ডিং। নিশ্চিত হয়ে দেখার জন্য আপনি নিজেই এটি সময় করতে পারেন। সাধারণত সম্ভাব্য এলএইচএস দেখার সহজতম উপায় হ'ল নির্গত সমাবেশটি দেখুন এবং দেখুন নিবন্ধক সংস্থাগুলির মধ্যে কোথা থেকে ডেটা জাগল রয়েছে; আপনার সংকলক স্মার্ট জিনিস করতে পারে, বা এটি নাও করতে পারে। ভেক্টরগুলিকে সাধারণকরণ হিসাবে, আমি এখানে আমার ফলাফলগুলি লিখেছিলাম: bit.ly/9W5zoU
ক্র্যাশওয়ার্কস

2
পাওয়ারপিসির জন্য হ্যাঁ: আইবিএমের একটি সিপিইউ সিমুলেটর রয়েছে যা স্থির বিশ্লেষণের মাধ্যমে এলএইচএস এবং অন্যান্য অনেক পাইপলাইন বুদবুদগুলির পূর্বাভাস দিতে পারে। কিছু পিপিসিগুলির কাছে এলএইচএসের জন্য একটি হার্ডওয়্যার কাউন্টার রয়েছে যা আপনি জরিপ করতে পারেন। এটি x86 এর পক্ষে আরও শক্ত; ভাল প্রোফাইলিংয়ের সরঞ্জামগুলি দুর্লভ (ভিটিউন এই দিনগুলিতে কিছুটা ভাঙা হয়েছে) এবং পুনরায় সাজানো পাইপলাইনগুলি হ্রাসকারী নয়। আপনি চক্র প্রতি নির্দেশাবলী পরিমাপ করে এটিকে যথাক্রমে পরিমাপের চেষ্টা করতে পারেন যা হার্ডওয়্যার পারফরম্যান্স কাউন্টারগুলির সাথে যথাযথভাবে করা যেতে পারে। "নির্দেশাবলী অবসরপ্রাপ্ত" এবং "মোট চক্র" নিবন্ধগুলি যেমন পিএপিআই বা পারফিউসাইট ( বিট.লি / অ্যান 6 সিএমটি ) দিয়ে পড়া যায়।
ক্র্যাশ ওয়ার্কস

2
আপনি কোনও ফাংশনে কিছু অনুমতি ছাড়াই লিখতে পারেন এবং তাদের দেখার জন্য যে কোনও বিশেষত স্টলের কারণে ভুগছে কিনা তা সময় করতে পারেন। ইন্টেল তাদের পাইপলাইনগুলি কীভাবে কাজ করে সে সম্পর্কে অনেকগুলি বিবরণ প্রকাশ করে না (যে তারা এলএইচএস মোটেও একটি নোংরা গোপন বিষয়), তাই আমি যা শিখেছি তার অনেকগুলিই এমন একটি দৃশ্যের দিকে তাকিয়ে ছিল যা অন্যান্য খিলানগুলিতে স্টল তৈরি করে (যেমন পিপিসি) ), এবং তারপরে x86 এর রয়েছে কিনা তা দেখার জন্য একটি নিয়ন্ত্রিত পরীক্ষা তৈরি করুন।
ক্র্যাশ ওয়ার্কস

উত্তর:


216

sqrtssএকটি সঠিক বৃত্তাকার ফলাফল দেয়। rsqrtssএকটি দেয় পড়তা পারস্পরিক করতে, 11 সম্পর্কে বিট সঠিক।

sqrtssযখন আরও নির্ভুলতার প্রয়োজন হয় তখন একটি আরও সঠিক ফলাফল তৈরি করা হয়। rsqrtssক্ষেত্রেগুলির জন্য উপস্থিত যখন প্রায় অনুমান হয় তবে গতি প্রয়োজন। আপনি যদি ইন্টেলের ডকুমেন্টেশন পড়ে থাকেন তবে আপনি একটি নির্দেশের ক্রমও দেখতে পাবেন (একক নিউটন-রাফসন পদক্ষেপের পরে পারস্পরিক স্কয়ার-রুট আনুমানিকতা) যা প্রায় সম্পূর্ণ নির্ভুলতা দেয় (যথাযথতার 23 ডলার বিট, যদি আমি সঠিকভাবে মনে করি), এবং এখনও কিছুটা চেয়ে দ্রুত sqrtss

সম্পাদনা করুন: গতি যদি সমালোচনামূলক হয় এবং আপনি সত্যিকার অর্থে এটি অনেকগুলি মানের জন্য কল করছেন তবে আপনার এই নির্দেশাবলীর ভেক্টরাইজড সংস্করণগুলি ব্যবহার করা উচিত, rsqrtpsবা sqrtpsউভয়ই প্রতিটি নির্দেশ প্রতি চারটি ভাসমান প্রক্রিয়া করে।


3
এন / আর পদক্ষেপ আপনাকে 22-বিট নির্ভুলতা দেয় (এটি দ্বিগুণ করে); 23-বিট হ'ল সম্পূর্ণ নির্ভুলতা হবে।
জ্যাস্পার বেকার্স 12:51

7
@ জ্যাস্পার বেকারস: না, তা হবে না। প্রথমত, ভাসমানটিতে 24 বিট নির্ভুলতা রয়েছে। দ্বিতীয়ত, sqrtssহয় সঠিকভাবে বৃত্তাকার , যা প্রয়োজন ~ 50 বিট rounding আগে, এবং একক স্পষ্টতা একটি সহজ এন / আর পুনরাবৃত্তির ব্যবহার করে অর্জন করা যাবে না।
স্টিফেন ক্যানন

1
এটি অবশ্যই কারণ। এই ফলাফলটি প্রসারিত করার জন্য: ইন্টেলের এমব্রি প্রকল্প ( সফটওয়্যার. intel.com/en-us/articles/… ), এর গণিতের জন্য ভেক্টরাইজেশন ব্যবহার করে। আপনি সেই লিঙ্কটিতে উত্সটি ডাউনলোড করতে পারেন এবং তারা তাদের 3/4 ডি ভেক্টরগুলি কীভাবে করেন তা দেখুন। তাদের ভেক্টর নরমালাইজেশন আরএসকিউআর্ট ব্যবহার করে নিউটন-রাফসনের একটি পুনরাবৃত্তি যা পরে খুব নির্ভুল এবং এখনও 1 / এসকিউআর্টের চেয়ে দ্রুত!
ব্র্যান্ডন পেলফ্রে

7
একটি ছোট ক্যাভিয়েট: x আরএসকিআরটি (এক্স) এর ফলস্বরূপ এনএন-এর ফলাফল হয় যদি x হয় শূন্য বা অসীম হয়। 0 * আরএসকিআরটি (0) = 0 * আইএনএফ = এনএন। INF rsqrt (INF) = INF * 0 = NaN। এই কারণে, এনভিআইডিআইএ জিপিইউগুলিতে সিইউডিএ আনুপাতিক একক-নির্ভুলতা বর্গমূলকে রিসিপ (আরএসকিআরটি (এক্স)) হিসাবে গণনা করে, হার্ডওয়্যারটি পারস্পরিক এবং পারস্পরিক ক্রোয়ের মূলের উভয়ের জন্য একটি দ্রুত সমীকরণ সরবরাহ করে। স্পষ্টতই, দুটি বিশেষ ক্ষেত্রে পরিচালিত সুস্পষ্ট চেকগুলিও সম্ভব (তবে জিপিইউতে ধীর হবে)।
njuffa

@ ব্র্যান্ডনপেলফ্রে কোন ফাইলটিতে আপনি নিউটন র্যাপসন পদক্ষেপটি খুঁজে পেয়েছেন?
ফ্রেডওভারফ্লো

7

এটি বিভাগের ক্ষেত্রেও সত্য। মালস (ক, আরসিপিএসএস (খ)) ডিআইভিএসএস (এ, খ) এর চেয়ে অনেক দ্রুত faster আপনি যখন নিউটন-র‌্যাফসন পুনরাবৃত্তির সাথে এর যথার্থতা বাড়িয়েছেন তখনও এটি এখনও দ্রুততর।

ইন্টেল এবং এএমডি উভয়ই তাদের অপটিমাইজেশন ম্যানুয়ালগুলিতে এই কৌশলটি সুপারিশ করে। যে অ্যাপ্লিকেশনগুলিতে আইইইই -754 সম্মতি প্রয়োজন হয় না, সেগুলি ডিভ / স্কয়ার্ট ব্যবহারের একমাত্র কারণ কোড পাঠযোগ্যতা।


1
ব্রডওয়েল এবং পরবর্তীকালে আরও ভাল এফপি বিভাজন কর্মক্ষমতা রয়েছে, তাই ক্ল্যাংয়ের মতো সংকলকরা সাম্প্রতিক সিপিইউগুলিতে স্কেলারের জন্য পারস্পরিক + নিউটন ব্যবহার না করা পছন্দ করেন, কারণ এটি সাধারণত দ্রুত হয় না । বেশিরভাগ লুপগুলিতে divএকমাত্র অপারেশন নয়, তাই মোট বা ইউরোপ থ্রুটপুট প্রায়শই বাধা রয়েছে এমনকি যখন divpsবা হয় divss। দেখুন বিন্দু বিভাগ ভাসমান বনাম ফ্লোটিং পয়েন্ট গুণ , যেখানে আমার উত্তর কেন একটি অধ্যায় আছে rcppsথ্রুপুট আর win একটি নয়। (বা একটি বিলম্বিত জয়), এবং বিভাজন থ্রুপুট / বিলম্বিত সংখ্যা numbers
পিটার কর্ডেস

যদি আপনার নির্ভুলতার প্রয়োজনীয়তাগুলি এত কম হয় যে আপনি নিউটনের পুনরাবৃত্তিটি এড়িয়ে যেতে পারেন, তবে হ্যাঁ a * rcpss(b)দ্রুত হতে পারে তবে এটি এখনও উও a/b!
পিটার কর্ডেস

5

কোনও উত্তর সরবরাহের পরিবর্তে, এটি আসলে ভুল হতে পারে (আমি ক্যাশে এবং অন্যান্য জিনিসগুলি সম্পর্কেও চেক বা তর্ক করতে যাচ্ছি না, আসুন তারা একরকম বলি) আমি আপনাকে এমন উত্সের দিকে নির্দেশ করার চেষ্টা করব যা আপনার প্রশ্নের উত্তর দিতে পারে।
পার্থক্যটি স্কয়ার্ট এবং আরএসকিআরটি কীভাবে গণনা করা যায় তার মধ্যে থাকতে পারে। আপনি এখানে আরও পড়তে পারেন http://www.intel.com / প্রোডাক্টস / প্রসেসর / ম্যানুয়ালস / । আমি আপনাকে ব্যবহার করা প্রসেসরের ফাংশনগুলি সম্পর্কে পড়া শুরু করার পরামর্শ দেব, বিশেষত আরএসকিআরটি সম্পর্কে কিছু তথ্য রয়েছে (সিপিইউ অভ্যন্তরীণ লুকিং টেবিলটি বিশাল সান্নিধ্যের সাথে ব্যবহার করছে, এটি ফলাফলটি পেতে আরও সহজ করে তোলে)। দেখে মনে হতে পারে যে, এসএসকিআরটি স্কয়ার্টের চেয়ে অনেক দ্রুত, যে 1 টি অতিরিক্ত মুল অপারেশন (যা ব্যয়বহুল নয়) এখানে পরিস্থিতি পরিবর্তন করতে পারে না।

সম্পাদনা: কয়েকটি তথ্য যা উল্লেখযোগ্য হতে পারে:
১. একবার আমি আমার গ্রাফিক্স লাইব্রেরির জন্য কিছু মাইক্রো অনুকূলকরণ করছিলাম এবং আমি ভেক্টরগুলির গণনা দৈর্ঘ্যের জন্য আরএসকিআরটি ব্যবহার করেছি। (স্কয়ার্টের পরিবর্তে, আমি এর আরএসকিআরটি দিয়ে আমার স্কোয়ারের যোগফলকে বহুগুণে বাড়িয়েছি), যা আপনি নিজের পরীক্ষাগুলিতে করেছেন ঠিক এটিই), এবং এটি আরও ভাল অভিনয় করেছে।
২. সাধারণ লুকোচুরি টেবিল ব্যবহার করে আরএসকিআরটি গণনা করা সহজ হতে পারে, যেমন আরএসকিআরটি হিসাবে, যখন এক্স অনন্তে চলে যায়, 1 / স্কয়ার্ট (এক্স) 0 তে চলে যায়, তাই ছোট এক্স এর জন্য ফাংশনের মান পরিবর্তন হয় না (অনেক), তবে স্কয়ার্ট - এটি অনন্তে চলে যায়, সুতরাং এটি এত সহজ ঘটনা;)।

এছাড়াও, স্পষ্টকরণ: আমি লিঙ্কিত বইগুলিতে এটি কোথায় পেয়েছি তা নিশ্চিত নই, তবে আমি নিশ্চিত যে আমি পড়েছি যে আরএসকিআরটি কিছু অনুসন্ধান সারণী ব্যবহার করছে, এবং ফলাফলটি কেবল তখনই ব্যবহার করা উচিত সঠিক হওয়ার দরকার নেই, যদিও - আমিও ভুল হতে পারি, যেমনটি কিছুকাল আগে ছিল :)।


4

নিউটন-রাফসন f(x)ইনক্রিমেন্ট ব্যবহারের শূন্যে রূপান্তরিত করে -f/f' যেখানে f'ডেরাইভেটিভ।

জন্য x=sqrt(y), আপনি সমাধানের জন্য চেষ্টা করতে পারেন f(x) = 0জন্য xব্যবহার f(x) = x^2 - y;

তারপরে ইনক্রিমেন্টটি হ'ল: এতে dx = -f/f' = 1/2 (x - y/x) = 1/2 (x^2 - y) / x ধীরে ধীরে বিভাজন রয়েছে।

আপনি অন্যান্য ফাংশন চেষ্টা করতে পারেন (যেমন f(x) = 1/y - 1/x^2) তবে সেগুলিও সমান জটিল।

আসুন এখন তাকান 1/sqrt(y)। আপনি চেষ্টা করতে পারেন f(x) = x^2 - 1/y, তবে এটি সমানভাবে জটিল হবে: dx = 2xy / (y*x^2 - 1)উদাহরণস্বরূপ। এর জন্য একটি অ-স্পষ্ট বিকল্প বিকল্প f(x)হ'ল:f(x) = y - 1/x^2

তারপর: dx = -f/f' = (y - 1/x^2) / (2/x^3) = 1/2 * x * (1 - y * x^2)

আহ! এটি একটি তুচ্ছ প্রকাশ নয়, তবে আপনার কেবল এতে বহুগুণ রয়েছে, কোনও বিভাজন নেই। => আরও দ্রুত!

এবং: সম্পূর্ণ আপডেট ধাপটি new_x = x + dxএরপরে পড়ে:

x *= 3/2 - y/2 * x * x যা খুব সহজ।


2

ইতিমধ্যে কয়েক বছর আগে থেকে এর অন্যান্য বেশ কয়েকটি উত্তর রয়েছে। Theকমত্যটি কী সঠিক হয়েছে তা এখানে:

  • আরএসকিআরটি * নির্দেশাবলী পারস্পরিক বর্গক্ষেত্রের সাথে একটি আনুমানিক হিসাব করে, প্রায় 11-12 বিট থেকে ভাল।
  • এটি ম্যান্টিসার দ্বারা সূচিত একটি লুকিং টেবিল (অর্থাত্ একটি রম) প্রয়োগ করা হয়েছে। (প্রকৃতপক্ষে, এটি সংকীর্ণ অনুসন্ধানের টেবিল, ট্রানজিস্টরগুলিকে বাঁচাতে লো-অর্ডারের বিটগুলিতে সামঞ্জস্য ব্যবহার করে পুরানো গণিতের ছকগুলির সমান))
  • এটি উপলভ্য হওয়ার কারণ হ'ল এফপিইউ "রিয়েল" স্কোয়ার রুট অ্যালগরিদমের জন্য ব্যবহৃত প্রাথমিক অনুমান।
  • আনুমানিক পারস্পরিক নির্দেশাবলীও রয়েছে, আরসিপি। এই উভয় নির্দেশাবলী এফপিইউ বর্গমূল এবং বিভাগ প্রয়োগ করে কীভাবে একটি সূত্র।

Theকমত্যটি কী ভুল হয়েছে তা এখানে:

  • এসএসই-যুগের এফপিইউগুলি বর্গমূলগুলি গণনা করতে নিউটন-রাফসন ব্যবহার করে না। এটি সফ্টওয়্যারের একটি দুর্দান্ত পদ্ধতি, তবে হার্ডওয়্যারে সেভাবে এটি প্রয়োগ করা ভুল হবে।

পারস্পরিক স্কোয়ার রুটের গণনা করার জন্য এনআর অ্যালগরিদমের এই আপডেট পদক্ষেপ রয়েছে, যেমন অন্যরা উল্লেখ করেছেন:

x' = 0.5 * x * (3 - n*x*x);

এটি প্রচুর ডেটা নির্ভর নির্ভর গুণ এবং একটি বিয়োগফল।

আধুনিক এফপিইউগুলি আসলে যে অ্যালগরিদম ব্যবহার করে তা অনুসরণ করে।

প্রদত্ত b[0] = n, ধরুন আমরা 1 টির কাছে পৌঁছে Y[i]এমন সংখ্যার একটি সিরিজ পেতে পারি b[n] = b[0] * Y[0]^2 * Y[1]^2 * ... * Y[n]^2Then তারপরে বিবেচনা করুন:

x[n] = b[0] * Y[0] * Y[1] * ... * Y[n]
y[n] = Y[0] * Y[1] * ... * Y[n]

স্পষ্টভাবে x[n]পন্থা sqrt(n)এবং y[n]পন্থা 1/sqrt(n)

পারিশ্রমিক বর্গমূলের জন্য ভাল পেতে আমরা নিউটন-রেফসন আপডেটের পদক্ষেপটি ব্যবহার করতে পারি Y[i]:

b[i] = b[i-1] * Y[i-1]^2
Y[i] = 0.5 * (3 - b[i])

তারপর:

x[0] = n Y[0]
x[i] = x[i-1] * Y[i]

এবং:

y[0] = Y[0]
y[i] = y[i-1] * Y[i]

পরের মূল পর্যবেক্ষণটি হ'ল b[i] = x[i-1] * y[i-1]। তাই:

Y[i] = 0.5 * (3 - x[i-1] * y[i-1])
     = 1 + 0.5 * (1 - x[i-1] * y[i-1])

তারপর:

x[i] = x[i-1] * (1 + 0.5 * (1 - x[i-1] * y[i-1]))
     = x[i-1] + x[i-1] * 0.5 * (1 - x[i-1] * y[i-1]))
y[i] = y[i-1] * (1 + 0.5 * (1 - x[i-1] * y[i-1]))
     = y[i-1] + y[i-1] * 0.5 * (1 - x[i-1] * y[i-1]))

তা হল, প্রাথমিক x এবং y দেওয়া, আমরা নিম্নলিখিত আপডেটের পদক্ষেপটি ব্যবহার করতে পারি:

r = 0.5 * (1 - x * y)
x' = x + x * r
y' = y + y * r

বা, এমনকি ফ্যানসিয়ার, আমরা সেট করতে পারি h = 0.5 * y। এটি সূচনা:

Y = approx_rsqrt(n)
x = Y * n
h = Y * 0.5

এবং এটি আপডেটের পদক্ষেপ:

r = 0.5 - x * h
x' = x + x * r
h' = h + h * r

এটি গোল্ডশ্মিড্টের অ্যালগরিদম, এবং আপনি এটি হার্ডওয়ারে প্রয়োগ করলে এটির একটি বিশাল সুবিধা রয়েছে: "অভ্যন্তরীণ লুপ" তিনটি গুণযুক্ত এবং অন্য কিছুই নয় এবং এর মধ্যে দুটি স্বতন্ত্র এবং পাইপলাইনযুক্ত হতে পারে।

1999-এ, এফপিইউগুলির ইতিমধ্যে একটি পাইপলাইনযুক্ত অ্যাড / সাবস্ট্রাক্ট সার্কিট এবং পাইপলাইনযুক্ত গুণিতক সার্কিটের প্রয়োজন ছিল, অন্যথায় এসএসই খুব "স্ট্রিমিং" হবে না। কেবলমাত্র স্কোয়ার রুটে প্রচুর হার্ডওয়্যার অপচয় না করে পুরোপুরি পাইপলাইনযুক্তভাবে এই অভ্যন্তরীণ লুপটি প্রয়োগ করতে 1999 সালে প্রতিটি সার্কিটের মধ্যে একটির প্রয়োজন ছিল।

আজ, অবশ্যই, আমরা প্রোগ্রামারটির কাছে এক্সপ্লোর করা মাল্টিপল অ্যাড যুক্ত করেছি। আবার, অভ্যন্তরীণ লুপটি তিনটি পাইপলাইনযুক্ত এফএমএ, যা আপনি আবার বর্গমূলকে গণনা না করলেও সাধারণত দরকারী।


1
সম্পর্কিত: জিসিসির স্কয়ার্ট () কীভাবে সংকলনের পরে কাজ করে? মূলের কোন পদ্ধতি ব্যবহার করা হয়? নিউটন-রাফসন? হার্ডওয়্যার ডিভি / স্কয়ার্ট এক্সিকিউশন ইউনিট ডিজাইনের কিছু লিঙ্ক রয়েছে। এসএসই / এভিএক্সের সাথে স্পেকটিভ ভ্যাক্টরাইজড আরএসকিআরটি এবং পারস্পরিক ক্রিয়াকলাপ নির্ভর করে - _mm256_rsqrt_psহ্যাসওয়েল পারফ অ্যানালাইসিস সহ এফএমএ সহ বা ব্যবহার ছাড়াই সফ্টওয়্যারটিতে একটি নিউটন পুনরাবৃত্তি । লুপে আপনার অন্য কাজ না থাকলে এবং ডিভাইডার থ্রুপুটে কঠোরভাবে বাধা হয়ে দাঁড়ায় যদি সাধারণত একটি ভাল ধারণা। এইচডাব্লু স্কয়ার্ট সিঙ্গল ইউওপ তাই ঠিক আছে অন্য কাজের সাথে মিশ্রিত।
পিটার কর্ডস

-2

এই নির্দেশগুলি রাউন্ডিং মোডগুলিকে উপেক্ষা করার কারণে এটি দ্রুততর হয় এবং ফ্লোটিন পয়েন্ট ব্যতিক্রম বা ডার্নর্মালাইজড সংখ্যাগুলি হ্যান্ডেল করে না। এই কারণে পাইপলাইন, অনুমান করা এবং আদেশের বাইরে থাকা অন্যান্য এফপি নির্দেশনা কার্যকর করা আরও সহজ।


অবশ্যই ভুল। এফএমএ বর্তমান রাউন্ডিং মোডের উপর নির্ভর করে তবে হাসওলে এবং তারপরে পরে প্রতি ঘড়িতে দু'জনের থ্রুটপুট রয়েছে। দুটি সম্পূর্ণ-পাইপলাইনযুক্ত এফএমএ ইউনিটের সাথে, হাসওলে একবারে 10 টি পর্যন্ত এফএমএ থাকতে পারে। সঠিক উত্তর হল rsqrt'র অনেক কম সঠিকতা, যা একটি শুরু অনুমান পেতে একটি সারণীর-লুকআপ পর অনেক কম কাজ করতে (বা আদৌ কেউ?) মানে।
পিটার কর্ডস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.