দুটি বিএলএএস বাস্তবায়ন দেওয়া, আমরা কি তারা আশা করতে পারি যে তারা ঠিক একই ভাসমান পয়েন্ট গণনা করে এবং একই ফলাফল ফেরত দেয়? অথবা এটা ঘটতে পারে, উদাহরণস্বরূপ, এক যে নির্ণয় স্কেলের পণ্য হিসাবে এবং এক ( এক্স 1 Y 1 + + এক্স 2 Y 2 ) + ( x 3 y 3 + x 4
দুটি বিএলএএস বাস্তবায়ন দেওয়া, আমরা কি তারা আশা করতে পারি যে তারা ঠিক একই ভাসমান পয়েন্ট গণনা করে এবং একই ফলাফল ফেরত দেয়? অথবা এটা ঘটতে পারে, উদাহরণস্বরূপ, এক যে নির্ণয় স্কেলের পণ্য হিসাবে এবং এক ( এক্স 1 Y 1 + + এক্স 2 Y 2 ) + ( x 3 y 3 + x 4
উত্তর:
না, এটি গ্যারান্টিযুক্ত নয়। আপনি যদি কোনও অপ্টিমাইজেশন ছাড়াই নেটব্লিব ব্যবহার করেন তবে এটি বেশিরভাগ ক্ষেত্রেই সত্য যে ফলাফলগুলি একই। তবে 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 বাস্তবায়ন যেমন আটলাস, এমকেএল, ইএসএসএল, ব্যবহার করে ... এই সমস্যাটি একই থাকে কারণ প্রতিটি বিএলএএস বাস্তবায়ন দ্রুত কোড পেতে বিভিন্ন অপ্টিমাইজেশন ব্যবহার করে। তবে যতদূর আমি জানি একজনের সত্যই ত্রুটিযুক্ত ফলাফলের জন্য একটি কৃত্রিম উদাহরণ প্রয়োজন।
যদি প্রয়োজন হয় যে বিএলএএস লাইব্রেরি একই ফলাফলের জন্য ফিরে আসে (বিট-ওয়াইজ সমান) একইর জন্য একটি পুনরুত্পাদনযোগ্য বিএলএএস লাইব্রেরি ব্যবহার করতে হবে যেমন:
সংক্ষিপ্ত উত্তর
যদি দুটি বিএলএএস বাস্তবায়ন ঠিক একই ক্রমে ক্রিয়াকলাপ সম্পাদনের জন্য লিখিত হয় এবং গ্রন্থাগারগুলি একই সংকলক পতাকা ব্যবহার করে এবং একই সংকলক সহ সংকলিত হয়, তবে তারা আপনাকে একই ফলাফল দেবে। ভাসমান পয়েন্ট গণিত এলোমেলো নয় , সুতরাং দুটি অভিন্ন বাস্তবায়ন অভিন্ন ফলাফল দেবে।
তবে বিভিন্ন ধরণের জিনিস রয়েছে যা পারফরম্যান্সের জন্য এই আচরণটি ভেঙে দিতে পারে ...
দীর্ঘ উত্তর
আইইইই প্রতিটি ক্রিয়াকলাপ কীভাবে আচরণ করা উচিত তা ছাড়াও এই ক্রিয়াকলাপগুলি যে ক্রমে পরিচালিত হয় সেটিকেও নির্দিষ্ট করে । তবে, আপনি যদি "বিস্ট-ম্যাথ" এর মতো বিকল্পগুলি দিয়ে আপনার বিএলএএস বাস্তবায়নটি সংকলন করেন তবে সংকলক রূপান্তরগুলি সম্পাদন করতে পারে যা সঠিক গাণিতিক ক্ষেত্রে সত্য তবে আইইইই ভাসমান পয়েন্টে "সঠিক" নয়। ক্যানোনিকাল উদাহরণ হ'ল ভাসমান পয়েন্ট সংযোজনের অ-সাহচর্যতা, যেমন আপনি উল্লেখ করেছেন। আরও আক্রমণাত্মক অপ্টিমাইজেশন সেটিংসের সাহায্যে সাহসীত্ব অনুমান করা হবে এবং প্রসেসর অপারেশনগুলিকে পুনরায় অর্ডার দিয়ে যতটা সম্ভব সমান্তরালভাবে এটি করবে।
if (x == 0) assert(x == 0)
হতে পারে, যা নির্দিষ্ট দৃষ্টিকোণ থেকে এলোমেলো হিসাবে ভাল is
if (x != 0) assert(x != 0)
, কারণ বর্ধিত-নির্ভুল গণিতের কারণে।
সাধারণভাবে, না। সাহচর্যকে একপাশে রেখে, সংকলক পতাকাগুলির পছন্দ (উদাহরণস্বরূপ, সিমডি নির্দেশাবলী সক্ষম করা হচ্ছে, ফিউজড মাল্টিপল অ্যাড ব্যবহার ইত্যাদি) বা হার্ডওয়্যার (যেমন, বর্ধিত নির্ভুলতা ব্যবহৃত হচ্ছে কিনা ) বিভিন্ন ফলাফল আনতে পারে।
পুনরুত্পাদনযোগ্য বিএলএএস বাস্তবায়ন পেতে কিছু প্রচেষ্টা রয়েছে। দেখুন ReproBLAS এবং ExBLAS আরও তথ্যের জন্য।