এই ধরণের প্রশ্নটি পুনরাবৃত্তি হচ্ছে এবং "এমএটিএলবি উচ্চতর অনুকূলিত লাইব্রেরি ব্যবহার করে" বা স্ট্যাক ওভারফ্লোতে একবারের জন্য "এমএটিএলবি এমকেএল ব্যবহার করে" এর চেয়ে আরও স্পষ্ট উত্তর দেওয়া উচিত।
ইতিহাস:
ম্যাট্রিক্স গুণ (একসাথে ম্যাট্রিক্স-ভেক্টর, ভেক্টর-ভেক্টর গুণ এবং ম্যাট্রিক্সের পচন অনেক) লিনিয়ার বীজগণিতের সবচেয়ে গুরুত্বপূর্ণ সমস্যা (যা)। ইঞ্জিনিয়াররা প্রথম থেকেই কম্পিউটারগুলির মাধ্যমে এই সমস্যাগুলি সমাধান করে চলেছেন।
আমি ইতিহাসের বিশেষজ্ঞ নই, তবে স্পষ্টতই ফিরে এসেছি, প্রত্যেকে সহজভাবে লুপের সাহায্যে তার ফোরট্রান সংস্করণটি আবার লিখেছিল। তারপরে কিছু মানীকরণ ঘটেছিল, "কার্নেলগুলি" (প্রাথমিক রুটিন) সনাক্তকরণের সাথে যে বেশিরভাগ লিনিয়ার বীজগণিত সমস্যাগুলি সমাধান করার জন্য প্রয়োজনীয়। এই মৌলিক ক্রিয়াকলাপগুলি তখন একটি স্পেসিফিকেশনে স্ট্যান্ডার্ড করা হয়: বেসিক লিনিয়ার বীজগণিত সাব-প্রোগ্রামস (বিএলএএস)। ইঞ্জিনিয়াররা তখন তাদের কোডগুলিতে এই স্ট্যান্ডার্ড, ভাল-পরীক্ষিত বিএলএএস রুটিনগুলিকে কল করতে পারে, তাদের কাজকে আরও সহজ করে তুলেছিল।
Blas:
বিএলএইএস স্তর 1 (প্রথম সংস্করণ যা স্কেলার-ভেক্টর এবং ভেক্টর-ভেক্টর অপারেশনগুলি সংজ্ঞায়িত করে) থেকে স্তর 2 (ভেক্টর-ম্যাট্রিক্স অপারেশন) থেকে স্তর 3 (ম্যাট্রিক্স-ম্যাট্রিক্স অপারেশন) এ বিবর্তিত হয়েছে এবং আরও "আরও অনেকগুলি কার্নেল" সরবরাহ করেছে যাতে আরও স্ট্যান্ডার্ড করা হয় এবং মৌলিক রৈখিক বীজগণিত অপারেশন। মূল ফোরট্রান 77 বাস্তবায়ন নেটলিবের ওয়েবসাইটে এখনও উপলব্ধ ।
উন্নত পারফরম্যান্সের দিকে:
তাই বছরের পর বছর ধরে (উল্লেখযোগ্যভাবে বিএলএএস স্তর 1 এবং স্তর 2 রিলিজের মধ্যে: 80 এর দশকের মধ্যে), ভেক্টর অপারেশন এবং ক্যাশে স্তরক্রমের আবির্ভাবের সাথে হার্ডওয়্যার পরিবর্তিত হয়েছিল। এই বিবর্তনগুলির ফলে বিএলএএস সাবরউইনগুলির কার্যক্ষমতা যথেষ্ট পরিমাণে বাড়ানো সম্ভব হয়েছিল। তারপরে বিভিন্ন বিক্রেতারা তাদের বিএলএএস রুটিনগুলি বাস্তবায়নের সাথে এসেছিলেন যা আরও এবং বেশি দক্ষ ছিল।
আমি সমস্ত historicalতিহাসিক বাস্তবায়ন জানি না (আমি জন্মগ্রহণ করি নি বা তখনকার একটি বাচ্চা ছিলাম) তবে 2000 এর দশকের গোড়ার দিকে দুটি উল্লেখযোগ্য উল্লেখযোগ্য বিষয় প্রকাশিত হয়েছিল: ইন্টেল এমকেএল এবং গোটোব্ল্যাস। আপনার মতলব ইন্টেল এমকেএল ব্যবহার করে যা একটি খুব ভাল, অপ্টিমাইজড বিএলএএস, এবং এটি আপনার দুর্দান্ত পারফরম্যান্সের ব্যাখ্যা দেয়।
ম্যাট্রিক্স গুণনের প্রযুক্তিগত বিবরণ:
তাহলে মতলব কেন (এমকেএল) এত দ্রুত dgemm
(ডাবল-স্পষ্টতা জেনারেল ম্যাট্রিক্স-ম্যাট্রিক্স গুণ)? সাধারণ ভাষায়: কারণ এটিতে ভেক্টরাইজেশন এবং ডেটা ভাল ক্যাচিং ব্যবহার করা হয়। আরও জটিল পদগুলিতে: জোনাথন মুর দ্বারা সরবরাহিত নিবন্ধটি দেখুন ।
মূলত, আপনি যখন সরবরাহ করেছেন সি ++ কোডে আপনার গুণটি সম্পাদন করেন, আপনি মোটেই ক্যাশে-বান্ধব নন। যেহেতু আমি সন্দেহ করি যে আপনি সারি সারিগুলিতে পয়েন্টারের একটি অ্যারে তৈরি করেছেন তাই আপনার "অভ্যন্তরীণ লুপে" ম্যাটিস 2 "এর কে-থ্রি কলামে আপনার প্রবেশাধিকারগুলি matice2[m][k]
খুব ধীর গতির। প্রকৃতপক্ষে, আপনি অ্যাক্সেস করার সময় matice2[0][k]
, আপনাকে অবশ্যই আপনার ম্যাট্রিক্সের অ্যারে 0 এর K-th উপাদানটি পেতে পারেন। তারপরে পরবর্তী পুনরাবৃত্তিতে আপনাকে অবশ্যই অ্যাক্সেস করতে হবে matice2[1][k]
যা অন্য অ্যারে (অ্যারে 1) এর K-th উপাদান। তারপরে পরবর্তী পুনরাবৃত্তিতে আপনি আরও একটি অ্যারে অ্যাক্সেস করতে পারবেন এবং আরও কিছু ... পুরো ম্যাট্রিক্স যেহেতু matice2
সর্বোচ্চ ক্যাশে ফিট করতে পারে না (এটি 8*1024*1024
বড় বাইট) তাই প্রোগ্রামটি অবশ্যই প্রচুর হারায় মূল স্মৃতি থেকে কাঙ্ক্ষিত উপাদানটি আনতে হবে সময়।
আপনি যদি কেবল ম্যাট্রিক্স স্থানান্তর করেছেন, যাতে অ্যাক্সেসগুলি মেমরির সংলগ্ন ঠিকানাগুলিতে থাকে, আপনার কোডটি ইতিমধ্যে আরও দ্রুত চলবে কারণ এখন সংকলক একই সাথে ক্যাশে পুরো সারি লোড করতে পারে। এই পরিবর্তিত সংস্করণটি কেবল চেষ্টা করে দেখুন:
timer.start();
float temp = 0;
//transpose matice2
for (int p = 0; p < rozmer; p++)
{
for (int q = 0; q < rozmer; q++)
{
tempmat[p][q] = matice2[q][p];
}
}
for(int j = 0; j < rozmer; j++)
{
for (int k = 0; k < rozmer; k++)
{
temp = 0;
for (int m = 0; m < rozmer; m++)
{
temp = temp + matice1[j][m] * tempmat[k][m];
}
matice3[j][k] = temp;
}
}
timer.stop();
সুতরাং আপনি দেখতে পাচ্ছেন কীভাবে লোকাল ক্যাশে আপনার কোডের কর্মক্ষমতা যথেষ্ট পরিমাণে বাড়িয়েছে। এখন বাস্তব dgemm
বাস্তবায়নগুলি এটি একটি বিস্তৃত স্তরে কাজে লাগায়: তারা টিএলবির আকার দ্বারা সংজ্ঞায়িত ম্যাট্রিক্সের ব্লকগুলিতে গুন সম্পাদন করে (অনুবাদ লুকাসাইড বাফার, দীর্ঘ গল্প সংক্ষিপ্ত: কার্যকরভাবে কী ক্যাশে করা যায়), যাতে তারা প্রসেসরে প্রবাহিত হয় that ঠিক কত পরিমাণে এটি প্রক্রিয়া করতে পারে অন্য দিকটি ভেক্টরাইজেশন, তারা প্রসেসরের ভেক্টরাইজড নির্দেশাবলী সর্বোত্তম নির্দেশনা থ্রুপুট জন্য ব্যবহার করে, যা আপনি আপনার ক্রস-প্ল্যাটফর্ম সি ++ কোড থেকে সত্যই করতে পারবেন না।
পরিশেষে, লোকেরা দাবি করছে যে এটি স্ট্র্যাসেন বা কপারসমিথ-উইনোগ্রাদ অ্যালগোরিদমের কারণে ভুল, উভয়ই আলগোরিদিমগুলি প্রয়োগে প্রয়োগ করা যায় না, কারণ উপরে উল্লিখিত হার্ডওয়ার বিবেচনার কারণে।