সিপিইউ ক্যাশে (সি তে) জন্য অনুকূলকরণ করার সময় কী গুরুত্বপূর্ণ?


13

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

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


ক্যাশে সর্বত্র এক নয়; স্পষ্টতই, তারা আকারে পৃথক হয়। কোনও গভীর গোপনীয়তা, কেবলমাত্র ভাল অভ্যাস (মাইকেল বর্গওয়ার্টের পরামর্শ মত) শেখার আশা করবেন না।
ডেভিড থর্নলি

উত্তর:


17
  • সম্ভব হলে আপনার ডেটা ছোট রাখুন
  • স্মৃতিতে একে অপরের পাশে একসাথে অ্যাক্সেস করা হবে এমন জিনিসগুলি (বা অন্যের পরে ডান দিকে) রাখুন
  • আপনার সংকলকটির অপ্টিমাইজেশন পরামিতিগুলি সম্পর্কে জানুন
  • পড়ুন কি যে প্রোগ্রামার মেমরির সম্পর্কে জানা উচিত আরো বিস্তারিত জানার জন্য আপনি কি কখনো চান পারে

"1 একে অপরের পাশে একসাথে অ্যাক্সেস করা হবে এমন জিনিসগুলি রাখুন" এর জন্য +1; এটিই ভুলে যাওয়া সহজ।
ডোনাল ফেলো

এবং সংকলকটি অনুকূলিতকরণ করতে বলুন।
ডানফোল্ড

@WTP: ডান - যুক্ত হয়েছে।
মাইকেল বর্গওয়ার্ট

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

12

এই ইস্যুটির জটিলতা আজকাল মানবিক বোধগম্যতার বাইরে। (এটি গত 5 বছর থেকে এমনটিই হয়েছে)) সংক্ষিপ্ত-ভেক্টর সমান্তরালতার (সম্মিলিত) একত্রিত করুন এবং আপনার হতাশার ধারণা রয়েছে যে হাতে হাতের কোডটি অপ্টিমাইজ করা এখন আর অর্থনৈতিকভাবে সম্ভব নয় - এটি সম্ভব নয়, তবে এটি হবে আর সাশ্রয়ী হতে হবে না।

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

নীচে তার একটি উত্তর ল্যারি ওব্রায়নের পোস্ট করা একটি লিঙ্ক রয়েছে ।

http://onward-conference.org/2011/images/Pueschel_2011_AutomaticPerformanceProgramming_Onward11.pdf


2
দ্রুততম বিএলএএস বাস্তবায়ন (গোটোব্ল্যাএলএস) ম্যাট্রিক্স গুণনের সর্বাধিক ক্যাশের ব্যবহার নিশ্চিত করতে হ্যান্ড-অপ্টিমাইজড কোড ব্যবহার করে
কোয়ান্ট_দেব

2

ক্যাশেগুলির পক্ষে বুঝতে এবং অনুকূলকরণ করা বেশ সম্ভব। এটি হার্ডওয়্যার বোঝার সাথে শুরু হয় এবং এটি সিস্টেমের নিয়ন্ত্রণে থাকে with সিস্টেমের উপর আপনার যত কম নিয়ন্ত্রণ থাকবে আপনি সফল হওয়ার সম্ভাবনা তত কম। লিনাক্স বা উইন্ডোজ এমন একাধিক অ্যাপ্লিকেশন / থ্রেড চালাচ্ছে যা অলস নয়।

বেশিরভাগ ক্যাশেগুলি তাদের বৈশিষ্ট্যগুলিতে কিছুটা অনুরূপ, হিটগুলি অনুসন্ধান করার জন্য ঠিকানা ক্ষেত্রের কিছু অংশ ব্যবহার করুন, গভীরতা (উপায়) এবং প্রস্থ (ক্যাশে রেখা) রাখুন। কারও কারও কাছে লেখার বাফার রয়েছে, কারও কাছে লেখার জন্য ক্যাশে দিয়ে বাইপাস লিখতে কনফিগার করা যেতে পারে ইত্যাদি etc.

আপনাকে যে সমস্ত মেমোরি লেনদেন চলছে সে সম্পর্কে আপনাকে তীব্রভাবে সচেতন করতে হবে (কিছু সিস্টেমে স্বতন্ত্র নির্দেশনা এবং ডেটা ক্যাশে কাজটি আরও সহজ করে তোলে) the

আপনি আপনার স্মৃতি যত্ন সহকারে পরিচালনা না করে সহজেই একটি ক্যাশে অকেজো করতে পারেন। উদাহরণস্বরূপ, যদি আপনার একাধিক ডেটা ব্লক থাকে তবে আপনি ক্যাশে রাখার প্রত্যাশায়, তবে সেগুলিতে স্মৃতিতে থাকে যা এমনকি ক্যাশে হিট / মিস পরীক্ষার তুলনায় বহুগুণ হয়, বলুন 0x10000 0x20000 0x30000, এবং আপনার আরও রয়েছে ক্যাশের উপায়গুলির চেয়ে আপনি খুব দ্রুত এমন কিছু তৈরি করতে পারেন যা ক্যাশে চালু হওয়ার সাথে ধীরে ধীরে চলে runs তবে সম্ভবত এটি 0x10000, 0x21000, 0x32000 এ পরিবর্তন করুন এবং এটি উচ্ছেদের হ্রাস করে, ক্যাশে পূর্ণ সুবিধা নেওয়ার পক্ষে যথেষ্ট।

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

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


1

উভয় nwong এর এবং মাইকেল Borgwardt এর উত্তর ভাল উপদেশ দেব।

এছাড়াও, এই বিষয়গুলিতে প্রথমে সংকলকের অপ্টিমাইজেশনের উপর বিশ্বাস করুন।

যদি সাম্প্রতিক কোনও জিসিসি সংকলক ব্যবহার করে থাকেন তবে আপনি এর __builtin_prefetchফাংশনটি (পার্সিমনি সহ) ব্যবহার করতে পারেন । দেখুন এই উত্তর Stackoverflow উপর।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.