বিএএলএস বাস্তবায়ন কি ঠিক একই ফলাফল দেওয়ার গ্যারান্টিযুক্ত?


17

দুটি বিএলএএস বাস্তবায়ন দেওয়া, আমরা কি তারা আশা করতে পারি যে তারা ঠিক একই ভাসমান পয়েন্ট গণনা করে এবং একই ফলাফল ফেরত দেয়? অথবা এটা ঘটতে পারে, উদাহরণস্বরূপ, এক যে নির্ণয় স্কেলের পণ্য হিসাবে এবং এক ( এক্স 1 Y 1 + + এক্স 2 Y 2 ) + ( x 3 y 3 + x 4

((এক্স1Y1+ +এক্স2Y2)+ +এক্স3Y3)+ +এক্স4Y4
তাই সম্ভবত আইইইই ভাসমান পয়েন্ট গণিতগুলিতে আলাদা ফলাফল দিচ্ছেন?
(এক্স1Y1+ +এক্স2Y2)+ +(এক্স3Y3+ +এক্স4Y4),

1
এই থ্রেডে বিএলএএস মানের সম্পর্কে কিছু অভিযোগ রয়েছে, পৃষ্ঠাতে সিবিএলএস অনুসন্ধান করুন। এটি সুপারিশ করবে যে তারা কেবল একই ফলাফল দেয় না, তবে তাদের সমস্তই যে কোনও কাজের পক্ষে যথেষ্ট সঠিক নয় ...
Szabolcs

উত্তর:


15

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

নেটলিব বিএলএএস-এ স্কেলার পণ্যটি কেবল 5 ফ্যাক্টর দ্বারা নিয়ন্ত্রিত লুপের জন্য:

DO I = MP1,N,5
          DTEMP = DTEMP + DX(I)*DY(I) + DX(I+1)*DY(I+1) +
     $            DX(I+2)*DY(I+2) + DX(I+3)*DY(I+3) + DX(I+4)*DY(I+4)
END DO

এবং প্রতিটি সংখ্যাকে অবিলম্বে ডিটিইএমপিতে যুক্ত করা হয় বা সমস্ত 5 টি উপাদান সংক্ষিপ্ত করে এবং ডিটিইএমপি-র তুলনায় যুক্ত করা হয় তবে এটি সংকলক পর্যন্ত। ওপেনব্লাসে এটি আরও জটিল কার্নেলটির উপর নির্ভর করে:

 __asm__  __volatile__
    (
    "vxorpd     %%ymm4, %%ymm4, %%ymm4               \n\t"
    "vxorpd     %%ymm5, %%ymm5, %%ymm5               \n\t"
    "vxorpd     %%ymm6, %%ymm6, %%ymm6               \n\t"
    "vxorpd     %%ymm7, %%ymm7, %%ymm7               \n\t"

    ".align 16                           \n\t"
    "1:                          \n\t"
        "vmovups                  (%2,%0,8), %%ymm12         \n\t"  // 2 * x
        "vmovups                32(%2,%0,8), %%ymm13         \n\t"  // 2 * x
        "vmovups                64(%2,%0,8), %%ymm14         \n\t"  // 2 * x
        "vmovups                96(%2,%0,8), %%ymm15         \n\t"  // 2 * x

    "vmulpd      (%3,%0,8), %%ymm12, %%ymm12 \n\t"  // 2 * y
    "vmulpd    32(%3,%0,8), %%ymm13, %%ymm13 \n\t"  // 2 * y
    "vmulpd    64(%3,%0,8), %%ymm14, %%ymm14 \n\t"  // 2 * y
    "vmulpd    96(%3,%0,8), %%ymm15, %%ymm15 \n\t"  // 2 * y

    "vaddpd      %%ymm4 , %%ymm12, %%ymm4 \n\t"  // 2 * y
    "vaddpd      %%ymm5 , %%ymm13, %%ymm5 \n\t"  // 2 * y
    "vaddpd      %%ymm6 , %%ymm14, %%ymm6 \n\t"  // 2 * y
    "vaddpd      %%ymm7 , %%ymm15, %%ymm7 \n\t"  // 2 * y

    "addq       $16 , %0	  	     \n\t"
	"subq	        $16 , %1            \n\t"      
    "jnz        1b                   \n\t"
...

যা স্কেলারের পণ্য 4 দৈর্ঘ্যের ছোট স্কেলার পণ্যগুলিতে বিভক্ত করে এবং তাদের যোগফল দেয়।

অন্যান্য সাধারণ BLAS বাস্তবায়ন যেমন আটলাস, এমকেএল, ইএসএসএল, ব্যবহার করে ... এই সমস্যাটি একই থাকে কারণ প্রতিটি বিএলএএস বাস্তবায়ন দ্রুত কোড পেতে বিভিন্ন অপ্টিমাইজেশন ব্যবহার করে। তবে যতদূর আমি জানি একজনের সত্যই ত্রুটিযুক্ত ফলাফলের জন্য একটি কৃত্রিম উদাহরণ প্রয়োজন।

যদি প্রয়োজন হয় যে বিএলএএস লাইব্রেরি একই ফলাফলের জন্য ফিরে আসে (বিট-ওয়াইজ সমান) একইর জন্য একটি পুনরুত্পাদনযোগ্য বিএলএএস লাইব্রেরি ব্যবহার করতে হবে যেমন:


8

সংক্ষিপ্ত উত্তর

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

তবে বিভিন্ন ধরণের জিনিস রয়েছে যা পারফরম্যান্সের জন্য এই আচরণটি ভেঙে দিতে পারে ...

দীর্ঘ উত্তর

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

একটি+ +*


3
"ভাসমান পয়েন্ট গণিত এলোমেলো নয়" । এটি দুঃখের বিষয় যে এটি স্পষ্টভাবে বর্ণনা করতে হয়েছে, তবে এটি মনে হচ্ছে যে অনেক লোকই এটি বলে মনে করেন ...
পাইপ

ঠিক আছে, অপ্রত্যাশিত এবং এলোমেলো দেখতে দেখতে অনেকটা একইরকম, এবং প্রচুর পরিচিতি প্রোগ্রামিং ক্লাস বলেছে যে "কখনও কখনও সমতার জন্য ভাসমান তুলনা করি না", যা এই ধারণা দেয় যে সঠিক মানটি পূর্ণসংখ্যার মতো একইভাবে নির্ভর করা যায় না।
টাইলার ওলসেন

@ টাইলারলসন এটি প্রশ্নের সাথে প্রাসঙ্গিক নয় এবং এই কারণেই এই ক্লাসগুলি এই জাতীয় কথা বলে না, তবে আইআইআরসি, সেখানে সংকলক বাগগুলির একটি শ্রেণি ছিল যেখানে সাম্য নির্ভর করা যায় না। উদাহরণস্বরূপ, কখনও কখনও ব্যর্থ if (x == 0) assert(x == 0) হতে পারে, যা নির্দিষ্ট দৃষ্টিকোণ থেকে এলোমেলো হিসাবে ভাল is
কিরিল

@ কিরিল দুঃখিত, আমি কেবল এই বিষয়টি তৈরি করার চেষ্টা করছিলাম যে ভাসমান পয়েন্ট কীভাবে কাজ করে তা অনেকেই সত্যই সত্যই জানতে পারে না। Pointতিহাসিক বিষয় হিসাবে, এটি এক ধরণের ভয়ঙ্কর, তবে আমি খেলায় আসার আগে এটি অবশ্যই সমাধান করা উচিত।
টাইলার ওলসেন

@ টাইলার ওলসেন উফ, আমার উদাহরণটি ভুল। এটি হওয়া উচিত if (x != 0) assert(x != 0), কারণ বর্ধিত-নির্ভুল গণিতের কারণে।
কিরিল 18

4

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

পুনরুত্পাদনযোগ্য বিএলএএস বাস্তবায়ন পেতে কিছু প্রচেষ্টা রয়েছে। দেখুন ReproBLAS এবং ExBLAS আরও তথ্যের জন্য।


1
ইন্টেলের এমকেএল বিএলএএস এর সাম্প্রতিক সংস্করণগুলিতে শর্তসাপেক্ষিক সংখ্যাগত পুনরুত্পাদনযোগ্যতা (সিএনআর) বৈশিষ্ট্যটিও দেখুন। অনুধাবন করুন যে এই স্তরের পুনরুত্পাদনযোগ্যতা পাওয়া সাধারণত আপনার গণনা কমিয়ে দেয় এবং এগুলি অনেকটা ধীর করে দিতে পারে!
ব্রায়ান বোর্চারস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.