আমি ভাবছি যে 2007 সাল থেকে মেমরি সম্পর্কে প্রতিটি প্রোগ্রামার যা জানা উচিত তা আলরিখ ড্রিপারের কতটা বৈধ। এছাড়াও আমি 1.0 বা একটি ত্রুটি-বিচ্যুতির চেয়ে নতুন সংস্করণ খুঁজে পাইনি।
আমি ভাবছি যে 2007 সাল থেকে মেমরি সম্পর্কে প্রতিটি প্রোগ্রামার যা জানা উচিত তা আলরিখ ড্রিপারের কতটা বৈধ। এছাড়াও আমি 1.0 বা একটি ত্রুটি-বিচ্যুতির চেয়ে নতুন সংস্করণ খুঁজে পাইনি।
উত্তর:
আমি যতদূর মনে করি ড্রেপারের বিষয়বস্তু মেমরি সম্পর্কে মৌলিক ধারণাগুলি বর্ণনা করে: সিপিইউ ক্যাশে কীভাবে কাজ করে, শারীরিক এবং ভার্চুয়াল মেমরি কী এবং লিনাক্স কার্নেল কীভাবে চিড়িয়াখানাটিকে ডিল করে। সম্ভবত কিছু উদাহরণগুলিতে পুরানো এপিআই রেফারেন্স রয়েছে তবে এতে কিছু আসে যায় না; এটি মৌলিক ধারণাগুলির প্রাসঙ্গিকতার উপর প্রভাব ফেলবে না।
সুতরাং, মৌলিক কিছু বর্ণনা করে এমন কোনও বই বা নিবন্ধকে পুরানো বলা যাবে না। "মেমোরি সম্পর্কে প্রতিটি প্রোগ্রামারকে যা জানা উচিত" তা অবশ্যই পড়া উচিত, তবে, ভাল, আমি এটি "প্রতিটি প্রোগ্রামার" এর জন্য মনে করি না। এটি সিস্টেম / এম্বেড / কার্নেল ছেলেদের জন্য আরও উপযুক্ত।
পিডিএফ ফর্মের গাইডটি https://www.akkadia.org/drepper/cpumemory.pdf এ রয়েছে ।
এটি এখনও দুর্দান্ত এবং অত্যন্ত প্রস্তাবিত (আমার দ্বারা, এবং আমি অন্যান্য পারফরম্যান্স-টিউনিং বিশেষজ্ঞদের দ্বারা মনে করি)। উলরিচ (বা অন্য যে কেউ) একটি 2017 আপডেট লিখে থাকলে এটি দুর্দান্ত হবে, তবে এটি অনেক কাজ হবে (উদাহরণস্বরূপ মানদণ্ডগুলি পুনরায় চালানো)। এছাড়াও অন্যান্য x86 পারফরম্যান্স-টিউনিং এবং এসএসই / এসএম (এবং সি / সি ++) অপ্টিমাইজেশনের লিঙ্কগুলি দেখুন Seeএক্স 86 ট্যাগ উইকি । (উলরিচের নিবন্ধটি x86 নির্দিষ্ট নয়, তবে তাঁর বেশিরভাগ মানদণ্ড x86 হার্ডওয়্যারে রয়েছে))
ড্রাম এবং ক্যাশেগুলি কীভাবে কাজ করে সেগুলি সম্পর্কে এখনও নিম্ন স্তরের হার্ডওয়্যার বিশদ । ডিডিআর 4 ডিডিআর 1 / ডিডিআর 2 (পড়ুন / লিখুন বিস্ফোরণ) এর জন্য বর্ণিত একই কমান্ড ব্যবহার করে । ডিডিআর 3/4 উন্নতিগুলি মৌলিক পরিবর্তন নয়। আফাইক, সমস্ত খিলান-স্বতন্ত্র স্টাফ এখনও সাধারণভাবে প্রয়োগ হয়, যেমন AArch64 / ARM32 এ 32
আরও দেখুন এই উত্তরটি লেটেন্সি বাউন্ড প্ল্যাটফর্ম অধ্যায় একক থ্রেডেড ব্যান্ডউইডথ উপর মেমরি / L3 লেটেন্সি প্রভাব সম্পর্কে গুরুত্বপূর্ণ বিবরণ জন্য: , এবং এই আসলে একটি জিওন মত একটি আধুনিক অনেক কোর CPU তে একক থ্রেডেড ব্যান্ডউইথ প্রাথমিক বোতলের হয় । তবে একটি কোয়াড-কোর স্কাইলেক ডেস্কটপটি একক থ্রেডের সাহায্যে ডিআআরএএম ব্যান্ডউইথকে সর্বাধিক সন্ধান করতে পারে। এই লিঙ্কটিতে এনটি স্টোর ও বনাম x86 এর সাধারণ স্টোর সম্পর্কে খুব ভাল তথ্য রয়েছে। স্কাইলাকে ব্রডওয়েল-ই এর চেয়ে একক থ্রেডেড মেমোরি থ্রুপুট জন্য কেন এত ভাল? একটি সংক্ষিপ্তসার।bandwidth <= max_concurrency / latency
এইভাবে NUM.৫.৮ এ উলরিচের পরামর্শটি অন্যান্য NUMA নোডগুলিতে এবং আপনার নিজের মতো করে দূরবর্তী মেমরির ব্যবহার সম্পর্কে সমস্ত ব্যান্ডউইথের ব্যবহার করা আধুনিক হার্ডওয়্যারটিতে পাল্টা-উত্পাদনশীল যেখানে মেমরি কন্ট্রোলারগুলির একটিমাত্র কোরের চেয়ে বেশি ব্যান্ডউইথ ব্যবহার করতে পারে। ভাল আপনি সম্ভবত এমন পরিস্থিতিটি কল্পনা করতে পারেন যেখানে স্বল্প-বিলম্বিত আন্ত-থ্রেড যোগাযোগের জন্য একই NUMA নোডে একাধিক মেমরি-ক্ষুধার্ত থ্রেড চালানোর নেট সুবিধা রয়েছে তবে সেগুলি উচ্চ ব্যান্ডউইদথ নন-লেটেন্সি-সংবেদনশীল স্টাফের জন্য রিমোট মেমরি ব্যবহার করে। তবে এটি বেশ অস্পষ্ট, সাধারণত NUMA নোডের মধ্যে থ্রেডগুলি ভাগ করে তাদের স্থানীয় মেমোরি ব্যবহার করতে দিন have পার-কোর ব্যান্ডউইদথ সর্বাধিক-একচেটিয়া সীমাবদ্ধতার কারণে বিলম্বিত হওয়ার জন্য সংবেদনশীল (নীচে দেখুন), তবে একটি সকেটের সমস্ত কোর সাধারণত সকেটের মেমরি নিয়ামকদের পরিপূর্ণ করার চেয়ে বেশি করতে পারে।
পরিবর্তিত একটি প্রধান বিষয় হ'ল পেন্টিয়াম 4 এর চেয়ে হার্ডওয়্যার প্রিফেচ অনেক ভাল এবং এটি বেশ বড় স্ট্রাইড পর্যন্ত স্ট্রাইড অ্যাক্সেস প্যাটার্নগুলি এবং একবারে একাধিক স্ট্রিমগুলি সনাক্ত করতে পারে (উদাহরণস্বরূপ 4k পৃষ্ঠায় এক ফরোয়ার্ড / পশ্চাৎ)। ইন্টেলের অপ্টিমাইজেশান ম্যানুয়ালটি তাদের স্যান্ডিব্রিজ-পরিবারের মাইক্রোআরকিটেকচারের জন্য ক্যাশের বিভিন্ন স্তরের এইচডাব্লু প্রিফেটারদের কিছু বিশদ বর্ণনা করে। আইভিব্রিজ এবং পরে পরবর্তী পৃষ্ঠার হার্ডওয়্যার প্রিফেচ রয়েছে, নতুন পৃষ্ঠায় একটি ক্যাশে মিসের অপেক্ষা না করে দ্রুত-প্রারম্ভিক ট্রিগার করতে। আমি ধরে নিই AMD এর অপ্টিমাইজেশান ম্যানুয়ালটিতে কিছু অনুরূপ স্টাফ রয়েছে। সাবধান হন যে ইন্টেলের ম্যানুয়ালটিও পুরানো পরামর্শে পূর্ণ, যার মধ্যে কয়েকটি কেবল পি 4 এর পক্ষে ভাল। স্যান্ডিব্রিজ-নির্দিষ্ট বিভাগগুলি অবশ্যই এসএনবির পক্ষে সঠিক, তবে যেমন egমাইক্রো-ফিউজড উফগুলির আন-ল্যামিনেশনটি এইচএসডাব্লুতে পরিবর্তিত হয়েছে এবং ম্যানুয়ালটিতে এটি উল্লেখ করা হয়নি ।
আজকালকার সাধারণ পরামর্শটি হ'ল পুরাতন কোড থেকে সমস্ত এসডাব্লু প্রিফেচ সরিয়ে ফেলা এবং প্রোফাইলিং ক্যাশে মিস করলে (এবং আপনি মেমরির ব্যান্ডউইথ স্যাটার্যাটিং করছেন না) কেবল তখনই এটি ফিরিয়ে দেওয়া বিবেচনা করুন। বাইনারি অনুসন্ধানের পরবর্তী ধাপের উভয় পক্ষের পূর্বনির্ধারণ এখনও সহায়তা করতে পারে। উদাহরণস্বরূপ আপনি একবারে কোন উপাদানটি পরবর্তীতে দেখতে হবে তা স্থির করে 1//4 এবং 3/4 উপাদানগুলি উপস্থাপন করুন যাতে তারা লোডিং / চেকিং মধ্যম সমান্তরালে লোড করতে পারে।
পৃথক প্রিফেচ থ্রেড (.3.৩.৪) ব্যবহার করার পরামর্শটি সম্পূর্ণ অপ্রচলিত , আমার ধারণা, এটি পেন্টিয়াম ৪-এ কেবল কখনও ভাল ছিল P পি 4-তে হাইপারথ্রেডিং ছিল (একটি লজিকাল কোর একটি শারীরিক অংশ ভাগ করে নিয়েছিল), তবে পর্যাপ্ত ট্রেস-ক্যাশে ছিল না (এবং / অথবা অফ-অর্ডার এক্সিকিউশন রিসোর্স) একই কোরটিতে দুটি সম্পূর্ণ গণনার থ্রেড চালিয়ে থ্রুপুট অর্জন করতে। তবে আধুনিক সিপিইউগুলি (স্যান্ডিব্রিজ-পরিবার এবং রাইজেন) অনেক বিফায়ার এবং এটি একটি আসল থ্রেড চালানো উচিত বা হাইপারথ্রেডিং ব্যবহার করা উচিত নয় (অন্য লজিক্যাল কোর অলস রেখে দিন যাতে আরওবি বিভাজনের পরিবর্তে একক থ্রেডের সম্পূর্ণ সংস্থান থাকে)।
সফ্টওয়্যার প্রিফেচ সবসময় "ভঙ্গুর" হয়ে থাকে : একটি স্পিডআপ পেতে ডান ম্যাজিক টিউনিং নম্বরগুলি হার্ডওয়ারের বিবরণ এবং সম্ভবত সিস্টেম লোডের উপর নির্ভর করে। চাহিদা লোডের আগে খুব তাড়াতাড়ি এবং এটি উচ্ছেদ করা হয়েছে। খুব দেরি হয়ে গেছে এবং এটি কোনও কাজে দেয় না। এই ব্লগ নিবন্ধটি সমস্যার অ-অনুক্রমিক অংশটিকে উপস্থাপনের জন্য হাসওলে এসডাব্লু প্রিফেট ব্যবহার করার জন্য একটি আকর্ষণীয় পরীক্ষার জন্য কোড + গ্রাফ দেখায়। উপস্থাপনা নির্দেশাবলী সঠিকভাবে কীভাবে ব্যবহার করতে হয় তা দেখুন ? । এনটি প্রিফেচ আকর্ষণীয়, তবে আরও ভঙ্গুর কারণ এল 1 থেকে প্রাথমিক উচ্ছেদের অর্থ আপনাকে কেবল এল 2 নয়, এল 3 বা ডিআরএমে যেতে হবে। আপনার যদি পারফরম্যান্সের প্রতিটি শেষ ড্রপ প্রয়োজন হয়, এবং আপনি একটি নির্দিষ্ট মেশিনের জন্য টিউন করতে পারেন তবে এসডাব্লু প্রিফেকটি অনুক্রমিক অ্যাক্সেসের জন্য সন্ধান করা উপযুক্ত তবে এটিপারে এখনও একটি মন্দার হতে যদি আপনি মেমরিতে bottlenecking পাসে এসে পড়বে অথচ তখন কি যথেষ্ট ALU কাজ আছে।
ক্যাশে লাইনের আকার এখনও 64 বাইট। (এল 1 ডি পঠন / লেখার ব্যান্ডউইথ খুব বেশি, এবং আধুনিক সিপিইউগুলি ঘড়ি প্রতি 1 ভেক্টর স্টোর 2 টি ভেক্টর স্টোর করতে পারে যদি এটি সমস্ত L1D এ যায় তবে দেখুন ক্যাশে কীভাবে দ্রুত হতে পারে? ) এভিএক্স 512 সহ লাইনের আকার = ভেক্টরের প্রস্থ, যাতে আপনি একটি নির্দেশে একটি সম্পূর্ণ ক্যাশে লাইন লোড / সঞ্চয় করতে পারেন। সুতরাং প্রতিটি বিভ্রান্তিকর লোড / স্টোর 256 বি এভিএক্স 1 / এভিএক্স 2 এর জন্য একে অপরের পরিবর্তে একটি ক্যাশে-লাইন সীমানা অতিক্রম করে, যা প্রায়শই L1D- এ ছিল না এমন অ্যারের উপরে লুপিংকে ধীর করে না।
স্বাক্ষরযুক্ত লোডের নির্দেশাবলীর শূন্য পেনাল্টি রয়েছে যদি ঠিকানাটি রানটাইম এ সারিবদ্ধ থাকে তবে সংকলকরা (বিশেষত জিসিসি) অটোভেক্টরিজিংয়ের সময় আরও ভাল কোড তৈরি করে যদি তারা কোনও সারিবদ্ধ গ্যারান্টি সম্পর্কে জানে। প্রকৃতপক্ষে স্বাক্ষরবিহীন ওপেনগুলি সাধারণত দ্রুত হয়, তবে পৃষ্ঠা-বিভাজনগুলি এখনও আঘাত করে (স্কাইলেকে খুব কম, যদিও কেবলমাত্র 11 ডলার অতিরিক্ত চক্রের বিলম্বতা বনাম 100, তবে এখনও একটি আউটপুট জরিমানা)।
উলরিচের পূর্বাভাস অনুসারে, প্রতিটি বহু-সকেট সিস্টেম আজকাল NUMA: ইন্টিগ্রেটেড মেমরি কন্ট্রোলারগুলি স্ট্যান্ডার্ড, অর্থাৎ কোনও বাহ্যিক নর্থব্রিজ নেই। তবে এসএমপি এর অর্থ মাল্টি-সকেট নয়, কারণ মাল্টি-কোর সিপিইউগুলি ব্যাপক। নেহালেম থেকে স্কাইলেক পর্যন্ত ইনটেল সিপিইউগুলি কোরের মধ্যে সংযোগের জন্য ব্যাকস্টপ হিসাবে একটি বৃহত অন্তর্ভুক্ত এল 3 ক্যাশে ব্যবহার করেছে। এএমডি সিপিইউগুলি আলাদা, তবে আমি বিশদটি হিসাবে পরিষ্কার নই।
স্কাইলেক-এক্স (এভিএক্স 512) এর সাথে আর একটি অন্তর্ভুক্ত এল 3 নেই, তবে আমি মনে করি যে এখনও একটি ট্যাগ ডিরেক্টরি রয়েছে যা এটি চিপের (এবং যদি তাই হয়) কোথাও আসলে কী করা হয়েছে তা সমস্ত কোরে স্নুপগুলি সম্প্রচার না করে তা পরীক্ষা করতে দেয়। দুর্ভাগ্যক্রমে, এসকেএক্স-এ রিং বাসের চেয়ে একটি জাল ব্যবহার করা হয়েছে , সাধারণত পূর্ববর্তী বহু-কোর জিয়োনসের চেয়ে আরও খারাপ লেটেন্সি রয়েছে।
মূলত মেমরি প্লেসমেন্টটি অনুকূলকরণ সম্পর্কিত সমস্ত পরামর্শ এখনও প্রযোজ্য, যখন আপনি ক্যাশে মিস বা বিতর্ক এড়াতে পারবেন না তখন ঠিক কী ঘটে যায় তার বিশদ পৃথক হয়।
.4.৪.২ পারমাণবিক অপস : হার্ডওয়্যার-আরবিট্রেটেডের তুলনায় সিএএস-পুনরায় চেষ্টা করা লুপকে 4x খারাপ হিসাবে দেখানো বেঞ্চমার্ক lock add
সম্ভবত এখনও সর্বাধিক বিতর্ক ক্ষেত্রে প্রতিফলিত করে । তবে আসল মাল্টি-থ্রেড প্রোগ্রামগুলিতে সিঙ্ক্রোনাইজেশনকে সর্বনিম্ন রাখা হয় (কারণ এটি ব্যয়বহুল), সুতরাং বিতর্ক কম হয় এবং একটি সিএএস-পুনরায় চেষ্টা করা লুপ সাধারণত পুনরায় চেষ্টা না করে সফল হয়।
সি ++ 11 std::atomic
fetch_add
একটি lock add
(বা lock xadd
যদি ফেরতের মান ব্যবহৃত হয়) এর সাথে সংকলন করবে তবে সিএএস ব্যবহার করে একটি এলগোরিদম এমন কোনও কাজ করতে যা lock
এড নির্দেশ দিয়ে করা যায় না এটি সাধারণত কোনও বিপর্যয় নয়। আপনি যদি একই স্থানটিতে পারমাণবিক এবং অ-পরমাণু অ্যাক্সেস না করতে চান তবে জিসিসি উত্তরাধিকার বিল্ট-ইন বা নতুন বিল্ট-ইনগুলির পরিবর্তে সি ++ 11std::atomic
বা সি 11 ব্যবহার করুন ...stdatomic
__sync
__atomic
৮.১ ডিডাব্লুসিএএস ( cmpxchg16b
) : আপনি জিসিসি এটি নির্গমন করতে কোক্সেক্স করতে পারেন, তবে আপনি যদি কেবলমাত্র অর্ধেক বস্তুর দক্ষ বোঝা চান, আপনার কুৎসিত union
হ্যাকের প্রয়োজন : আমি সি ++ ১১ সিএএস দিয়ে কীভাবে এবিএ কাউন্টারটি প্রয়োগ করতে পারি? । ( 2 পৃথক মেমরি অবস্থানের ডিসিএএস দিয়ে ডিডাব্লুসিএএসকে বিভ্রান্ত করবেন না। ডিডাব্লুসিএএসের মাধ্যমে ডিসিএএস -এর লক-ফ্রি পারমাণবিক অনুকরণ সম্ভব নয়, তবে লেনদেনের মেমরিটি (x86 টিএসএক্সের মতো এটি সম্ভব করে তোলে)))
8.2.4 ট্রানজেকশনাল মেমোরি : দু'বার ভুয়া শুরু হওয়ার পরে (খুব কমই ট্রিগার হওয়া বাগের কারণে মাইক্রোকোড আপডেট দ্বারা অক্ষম করা হয়) এর পরে ইন্টেলের দেরী-মডেল ব্রডওয়েল এবং সমস্ত স্কাইলেক সিপিইউতে লেনদেনের মেমরি কাজ করে। ডেভিড ক্যান্টার হাসওয়েলের জন্য বর্ণনা করেছেন এখনও ডিজাইন । নিয়মিত লক ব্যবহার করে (এবং ফিরে যেতে পারে) কোডটি গতিতে ব্যবহার করার জন্য একটি লক-এলিজেন্স উপায় রয়েছে (বিশেষত ধারকটির সমস্ত উপাদানগুলির জন্য একক লক দিয়ে তাই একই সমালোচনামূলক বিভাগে একাধিক থ্রেড প্রায়শই সংঘর্ষে না আসে ), বা সরাসরি লেনদেন সম্পর্কে জানে এমন কোড লিখুন।
7.5 হুগপেজ : অজ্ঞাতনামা স্বচ্ছ হ্যালিপেজগুলি লিনাক্সে ম্যানুয়ালি হুগেলবিএফ ব্যবহার না করে ভালভাবে কাজ করে। মেক বরাদ্দ> = 2MiB 2MiB প্রান্তিককরণ সঙ্গে (যেমন posix_memalign
, অথবা একটিaligned_alloc
যে মূঢ় আইএসও সি ++ 17 প্রয়োজন ব্যর্থ যখন জোরদার নেই size % alignment != 0
)।
একটি 2 এমআইবি-প্রান্তযুক্ত বেনামে বরাদ্দ ডিফল্টরূপে বিশাল পাতাগুলি ব্যবহার করবে। কিছু কাজের চাপ (উদাহরণস্বরূপ যেগুলি বড় পরিমাণে বরাদ্দগুলি তৈরি করার পরে কিছুক্ষণ ব্যবহার করে রাখুন)
echo always >/sys/kernel/mm/transparent_hugepage/defrag
যখন প্রয়োজন হবে তখন কার্নেলটি 4k পৃষ্ঠায় ফিরে যাওয়ার পরিবর্তে শারীরিক স্মৃতি ডিফ্র্যাগ করতে সুবিধা পেতে পারে । ( কার্নেল ডক্স দেখুন )। বিকল্পভাবে, madvise(MADV_HUGEPAGE)
বড় বরাদ্দ করার পরে ব্যবহার করুন (2MiB প্রান্তিককরণের সাথে এখনও পছন্দসই)।
পরিশিষ্ট বি: ওপ্রোফিল : লিনাক্স perf
বেশিরভাগ ক্ষেত্রে ছাড়িয়ে গেছে oprofile
। নির্দিষ্ট মাইক্রোআরকিটেকচার সম্পর্কিত নির্দিষ্ট ইভেন্টগুলির জন্য, মোড়ক ব্যবহার করুনocperf.py
। যেমন
ocperf.py stat -etask-clock,context-switches,cpu-migrations,page-faults,cycles,\
branches,branch-misses,instructions,uops_issued.any,\
uops_executed.thread,idq_uops_not_delivered.core -r2 ./a.out
এটি ব্যবহারের কয়েকটি উদাহরণের জন্য, দেখুন x86 এর এমওভি সত্যিই "মুক্ত" হতে পারে? আমি কেন এটিকে পুনরুত্পাদন করতে পারি না? ।
আমার তাত্ক্ষণিক নজর থেকে এটি বেশ নির্ভুল দেখায় looks একটি বিষয় লক্ষণীয়, "সংহত" এবং "বাহ্যিক" মেমরি নিয়ামকগুলির মধ্যে পার্থক্যের অংশ। যখন থেকে আই 7 লাইনটি ইন্টেল সিপিইউগুলি প্রকাশের সাথে সাথে সমস্ত সংহত হয়েছে এবং এএমডি 64 চিপগুলি প্রথম প্রকাশিত হওয়ার পর থেকে এএমডি সংহত মেমরি নিয়ামক ব্যবহার করছে।
যেহেতু এই নিবন্ধটি লেখা হয়েছিল, পুরোটা বদলে যায়নি, গতিও বেশি বেড়েছে, মেমরির নিয়ামকরা আরও বুদ্ধিমান হয়ে উঠেছে (আই 7 র্যাম লিখতে বিলম্ব করবে যতক্ষণ না এটি পরিবর্তনগুলি করার মতো মনে হয়), তবে পুরোটা খুব একটা বদলেনি not । কোনও সফ্টওয়্যার বিকাশকারী কোনওভাবেই তার যত্ন নেবেন না।