এটি আমাকে ভাবছে যে বর্তমান শিল্পের পরিস্থিতিতে মাল্টিথ্রেডিং কতটা গুরুত্বপূর্ণ?
পারফরম্যান্স-সমালোচনামূলক ক্ষেত্রগুলিতে যেখানে পারফরম্যান্সটি ভারী-উত্তোলন করে তৃতীয় পক্ষের কোড থেকে আসে না, তবে আমাদের নিজস্ব, তবে আমি সিপিইউ দৃষ্টিকোণ থেকে গুরুত্বের এই ক্রমে জিনিসগুলি বিবেচনা করব (জিপিইউ আমি জিতেছি এমন একটি ওয়াইল্ডকার্ড) প্রবেশ করা যাবে না):
- মেমরি দক্ষতা (উদা: রেফারেন্সের স্থানীয়তা)।
- আলগোরিদিমজাত
- Multithreading
- SIMD
- অন্যান্য অপ্টিমাইজেশন (স্থির শাখার পূর্বাভাসের ইঙ্গিতগুলি, যেমন)
নোট করুন যে এই তালিকাটি কেবলমাত্র গুরুত্বের উপর ভিত্তি করে নয় তবে রক্ষণাবেক্ষণের ক্ষেত্রে তাদের প্রভাব যেমন, তারা কতটা সোজা (যদি না হয় তবে তালিকার অন্যদের সাথে তাদের মিথস্ক্রিয়া ইত্যাদি) এর মতো অনেকগুলি গতিশীলতা based
মেমরি দক্ষতা
অ্যালগরিদমিকের চেয়ে মেমরির দক্ষতার আমার পছন্দটি সম্পর্কে সবচেয়ে অবাক হতে পারে। এটি কারণ মেমরির দক্ষতা এই তালিকার অন্যান্য 4 টি আইটেমের সাথে ইন্টারঅ্যাক্ট করে এবং এটি কারণ এটি "বাস্তবায়ন" বিভাগের পরিবর্তে "নকশা" বিভাগে প্রায়শই বিবেচনা করা হয়। এখানে মুরগির স্বভাব বা ডিমের সমস্যা রয়েছে যা মেমরির দক্ষতা বোঝার জন্য প্রায়শই তালিকার সমস্ত 4 টি আইটেম বিবেচনা করা প্রয়োজন, অন্য 4 টি আইটেমের জন্যও মেমরির দক্ষতা বিবেচনা করা প্রয়োজন। তবুও এটি সবকিছুর কেন্দ্রস্থলে।
উদাহরণস্বরূপ, যদি আমাদের এমন কোনও ডেটা স্ট্রাকচারের প্রয়োজন হয় যা পিছনে লিনিয়ার-টাইম সিক্যুয়াল অ্যাক্সেস এবং ধ্রুবক-সময় সন্নিবেশ এবং ছোট উপাদানগুলির জন্য অন্য কিছু না করে, তবে এখানে নিষ্পাপ পছন্দটি একটি লিঙ্কযুক্ত তালিকান would এটি মেমরির দক্ষতা উপেক্ষা করে। আমরা যখন মিশ্রণে স্মৃতিশক্তির দক্ষতা বিবেচনা করি, তারপরে আমরা এই দৃশ্যে আরও সুসংগত কাঠামো বাছাই করে শেষ করি, যেমন বর্ধনযোগ্য অ্যারে-ভিত্তিক কাঠামো বা আরও স্বচ্ছ নোডের (উদাহরণস্বরূপ: একটি নোডের মধ্যে একটি 128 উপাদান সংরক্ষণ করে) একসাথে যুক্ত বা খুব কম সময়ে একটি পুল বরাদ্দকারী দ্বারা সমর্থিত একটি লিঙ্ক তালিকা। একই অ্যালগোরিদমিক জটিলতা থাকা সত্ত্বেও এগুলির একটি নাটকীয় প্রান্ত রয়েছে। তেমনি, আমরা প্রায়শই স্মৃতিশক্তির দক্ষতার কারণে একটি নিকৃষ্ট অ্যালগরিদমিক জটিলতা সত্ত্বেও মার্জ সাজানোর উপরে একটি অ্যারের কুইকোর্টটি নির্বাচন করি।
তেমনি, আমাদের মেমরি অ্যাক্সেসের ধরণগুলি এত বেশি দানাদার এবং প্রকৃতির ছড়িয়ে ছিটিয়ে থাকলে কার্যকর কোডটি সবচেয়ে দানাদার স্তরে লক করার সময় আমরা মিথ্যা ভাগ করে নেওয়ার পরিমাণটি সর্বাধিক শেষ করি। সুতরাং মেমরি দক্ষতা দক্ষতা বহুগঠিতকে বহুগুণ করে। থ্রেড সর্বাধিক পাওয়ার জন্য এটি পূর্বশর্ত।
তালিকার উপরের প্রতিটি আইটেমের সাথে ডেটাগুলির সাথে একটি জটিল ইন্টারঅ্যাকশন রয়েছে এবং ডেটা কীভাবে উপস্থাপন করা হয় তা ফোকাস করে শেষ পর্যন্ত মেমরির দক্ষতার শিরাতে। উপরের এই প্রত্যেকটিই উপাত্ত উপস্থাপন বা অ্যাক্সেস করার অনুপযুক্ত উপায়ে বাধা দেওয়া যেতে পারে।
মেমরির দক্ষতা এত গুরুত্বপূর্ণ হওয়ার অন্য কারণটি এটি একটি সম্পূর্ণ কোডবেজ জুড়ে প্রয়োগ করতে পারে । সাধারণত লোকেরা যখন কল্পনা করে যে অদক্ষতা এখানে এবং সেখানে কাজের সামান্য বিটি বিভাগ থেকে জমা হয়, এটি একটি চিহ্ন যে তাদের একটি প্রোফাইলার ধরতে হবে। তবুও স্বল্প-স্বল্প ক্ষেত্রগুলি বা খুব সীমিত হার্ডওয়্যার নিয়ে কাজ করার পরে, প্রোফাইলিংয়ের পরেও এমন সেশনগুলি পাওয়া যাবে যে কোনও কোডবেসে কোনও স্পষ্ট হটস্পট (কেবল পুরো সময় ছড়িয়ে ছিটিয়ে নেই) নির্দেশ করে যেগুলি এটি বরাদ্দকরণ, অনুলিপি করা এবং অনিবার্যভাবে কার্যকরভাবে অক্ষম ine অ্যাক্সেস মেমরি সাধারণত এটি শুধুমাত্র তখনই যখন কোনও সম্পূর্ণ কোডবেস কোনও পারফরম্যান্স উদ্বেগের জন্য সংবেদনশীল হতে পারে যা কোডবেজ জুড়ে প্রয়োগ করা মানগুলির পুরো নতুন সেটকে নিয়ে যেতে পারে এবং মেমরির দক্ষতা প্রায়শই এর কেন্দ্রস্থলে থাকে।
আলগোরিদিমজাত
এই এক একটি খুব দেওয়া, যেমন একটি বাছাই অ্যালগরিদম পছন্দ হিসাবে একটি বড় ইনপুট মাস কয়েক সেকেন্ড বনাম বাছাই করতে সময় নিতে পার্থক্য করতে পারে। এটি সবার মধ্যে সবচেয়ে বড় প্রভাব ফেলবে যদি পছন্দটি যদি বলা হয়, সত্যিই সাব-পার্ট কোয়াড্র্যাটিক বা কিউবিক অ্যালগরিদম এবং লিনিয়ারীথমিক একটি বা লিনিয়ার এবং লোগারিথমিক বা ধ্রুবকের মধ্যে অন্ততঃ আমাদের 10,000,000 কোর মেশিনের মতো না থাকে (তবে এই ক্ষেত্রে স্মৃতিশক্তি দক্ষতা আরও গুরুত্বপূর্ণ হয়ে উঠবে)।
এটি আমার ব্যক্তিগত তালিকার শীর্ষে নেই, তবে যেহেতু তাদের ক্ষেত্রে দক্ষ কেউ হতাশায় কুলিংয়ের জন্য একটি ত্বরণ কাঠামো ব্যবহার করতে জানেন, উদাহরণস্বরূপ আমরা আলগোরিদিমিক জ্ঞান দ্বারা স্যাচুরেটেড, এবং ট্রাইয়ের বিভিন্ন রূপ ব্যবহার করার মতো জিনিসগুলি জেনে যেমন উপসর্গ ভিত্তিক অনুসন্ধানের জন্য একটি মূল গাছটি হ'ল শিশুর স্টাফ। আমরা যে ক্ষেত্রের মধ্যে কাজ করছি তার এই ধরণের প্রাথমিক জ্ঞানের অভাব রয়েছে, তবে অ্যালগরিদমিক দক্ষতা অবশ্যই শীর্ষে উঠবে, তবে প্রায়শই অ্যালগরিদমিক দক্ষতা তুচ্ছ।
এছাড়াও নতুন অ্যালগরিদম উদ্ভাবন করা কিছু ক্ষেত্রে প্রয়োজনীয়তা হতে পারে (উদা: জাল প্রক্রিয়াকরণে আমাকে শত শত আবিষ্কার করতে হয়েছিল যেহেতু সেগুলির আগে উপস্থিত ছিল না, বা অন্যান্য পণ্যগুলিতে অনুরূপ বৈশিষ্ট্যগুলির প্রয়োগগুলি মালিকানাধীন গোপনীয়তা ছিল, কোনও কাগজে প্রকাশিত হয়নি) )। যাইহোক, একবার আমরা সমস্যা সমাধানের অংশটি অতিক্রম করে সঠিক ফলাফল পাওয়ার জন্য কোনও উপায় খুঁজে বের করি এবং দক্ষতা একবার লক্ষ্য হয়ে ওঠে তবে এটি অর্জনের একমাত্র উপায় হ'ল আমরা কীভাবে ডেটা (মেমরি) এর সাথে ইন্টারেক্ট করছি consider স্মৃতিশক্তির দক্ষতা না বুঝে, নতুন অ্যালগরিদম এটি দ্রুততর করার ব্যর্থ প্রচেষ্টা সহ অযথা জটিল হয়ে উঠতে পারে, যখন কেবল সহজ, আরও মার্জিত আলগোরিদম উত্পন্ন করার জন্য মেমরির দক্ষতার বিষয়ে একটু বেশি বিবেচনা করার প্রয়োজন ছিল।
শেষ অবধি, অ্যালগোরিদমগুলি মেমরির দক্ষতার চেয়ে "বাস্তবায়ন" বিভাগে বেশি থাকে। প্রাথমিকভাবে ব্যবহৃত উপ-অনুকূল অ্যালগরিদম দিয়েও তারা প্রায়শই অন্ধচক্ষুতে উন্নতি করতে সহজ হয়। উদাহরণস্বরূপ, একটি নিকৃষ্ট চিত্র প্রক্রিয়াকরণ অ্যালগরিদম প্রায়শই স্রেফ কোডবেজে একটি স্থানীয় জায়গায় প্রয়োগ করা হয়। এটি পরে আরও একটি ভাল সঙ্গে অদলবদল করা যেতে পারে। তবে, সমস্ত চিত্র প্রক্রিয়াকরণ অ্যালগরিদম যদি এমন Pixel
ইন্টারফেসের সাথে আবদ্ধ থাকে যার উপ-অনুকূল মেমরির উপস্থাপনা থাকে তবে এটি সংশোধন করার একমাত্র উপায় একাধিক পিক্সেলকে উপস্থাপন করার পদ্ধতিটি (এবং এককটি নয়) পরিবর্তন করা হয়, তবে আমরা প্রায়শই এসওএল এবং সম্পূর্ণভাবে একটি কোডবেসকে আবার লিখতে হবেImage
ইন্টারফেস. একই ধরণের জিনিসটি বাছাই করা অ্যালগরিদম প্রতিস্থাপনের জন্য যায় - এটি সাধারণত একটি বাস্তবায়নের বিশদ হয়, যখন ডেটা বাছাইয়ের অন্তর্নিহিত উপস্থাপনার সম্পূর্ণ পরিবর্তন বা বার্তাগুলির মধ্য দিয়ে যেভাবে পাস করা হয় তার জন্য ইন্টারফেসগুলির পুনরায় নকশার প্রয়োজন হতে পারে।
Multithreading
মাল্টিথ্রেডিং কর্মক্ষমতা প্রসঙ্গে একটি শক্ত কারণ যেহেতু এটি একটি মাইক্রো-লেভেল অপ্টিমাইজেশান হার্ডওয়্যার বৈশিষ্ট্যগুলিতে খেলছে তবে আমাদের হার্ডওয়্যারটি সেই দিকটিতে সত্যই স্কেলিং করছে। ইতিমধ্যে আমার কাছে পিয়ার রয়েছে যাদের 32 টি কোর রয়েছে (আমার কাছে কেবল 4)।
তবুও যদি উদ্দেশ্যটি সফ্টওয়্যারটি গতিতে ব্যবহার করা হয় তবে কোনও পেশাদারের কাছে জানা সবচেয়ে বিপজ্জনক মাইক্রো-অপটিমাইজেশনগুলির মধ্যে মুলিথ্রেডিং অন্যতম। জাতিটির অবস্থাটি অত্যন্ত মারাত্মক ত্রুটিযুক্ত, কারণ এটি প্রকৃতির এতটাই নির্বিচারবাদী (সম্ভবত যদি কোনও ডিবাগিং প্রসঙ্গে বাইরে কোনও অসুবিধাগুলির সময়ে কোনও বিকাশকারীর মেশিনে প্রতি কয়েকমাসে একবার প্রদর্শিত হয়) তবে তা সম্ভবত)। সুতরাং এটির মধ্যে এই সকলের মধ্যে রক্ষণাবেক্ষণযোগ্যতা এবং কোডের সম্ভাব্য নির্ভুলতার উপর তর্কযোগ্যভাবে সবচেয়ে নেতিবাচক অবনতি ঘটেছে, বিশেষত যেহেতু মাল্টিথ্রেডিং সম্পর্কিত বাগগুলি খুব সতর্কতার সাথে পরীক্ষার রাডারের আওতায় সহজেই উড়তে পারে।
যাইহোক, এটি এত গুরুত্বপূর্ণ হয়ে উঠছে। যদিও এটি এখনও সবসময় মেমরির দক্ষতার মতো কিছু (যা কখনও কখনও জিনিসগুলি কয়েকগুণ দ্রুততর করে তুলতে পারে) এর মতো কোনও ট্রাম্প নাও থাকতে পারে, এখন আমাদের আরও বেশি কোর দেখা যাচ্ছে। অবশ্যই, এমনকি 100-কোর মেশিন থাকা সত্ত্বেও, আমি এখনও তালিকার শীর্ষে মেমরির দক্ষতা রাখব, যেহেতু থ্রেড দক্ষতা এগুলি ব্যতীত সাধারণত অসম্ভব। একটি প্রোগ্রাম এই জাতীয় মেশিনে একশো থ্রেড ব্যবহার করতে পারে এবং দক্ষ মেমরির উপস্থাপনা এবং অ্যাক্সেস প্যাটার্নগুলির ধীর গতিতে ধীর হতে পারে (যা লকিংয়ের ধরণগুলিতে আবদ্ধ হবে)।
SIMD
নিবন্ধগুলি আরও বিস্তৃত হওয়ার সাথে সাথে আরও বিস্তৃত হওয়ার পরিকল্পনা সহ সিমডও কিছুটা বিশ্রী। মূলত আমরা 64৪-বিট এমএমএক্স রেজিস্ট্রারগুলি দেখেছি যারপরে 128-বিট এক্সএমএম রেজিস্টর সমান্তরালে 4 এসপিএফপি অপারেশন করতে সক্ষম। এখন আমরা 256-বিট ওয়াইএমএম রেজিস্টারগুলি সমান্তরাল 8 টিতে সক্ষম capable এবং ইতিমধ্যে 512-বিট রেজিস্টারগুলির জন্য স্থানে পরিকল্পনা রয়েছে যা সমান্তরালে 16 টির অনুমতি দেবে।
এগুলি মাল্টিথ্রেডিংয়ের দক্ষতার সাথে ইন্টারঅ্যাক্ট করবে এবং বহুগুণ হবে। তবুও সিমডি মেন্টিথ্রেডিংয়ের মতোই রক্ষণাবেক্ষণযোগ্যতা হ্রাস করতে পারে। যদিও এগুলির সাথে সম্পর্কিত বাগগুলি পুনরুত্পাদন এবং স্থিরতা বা রেসের শর্ত হিসাবে ঠিক করা ততটা কঠিন নয়, বহনযোগ্যতা বিশিষ্ট এবং কোডটি প্রত্যেকের মেশিনে চলতে পারে তা নিশ্চিত করে (এবং তাদের হার্ডওয়্যার দক্ষতার ভিত্তিতে উপযুক্ত নির্দেশাবলী ব্যবহার করে) বিশ্রী।
আরেকটি বিষয় হ'ল কম্পাইলাররা সাধারণত দক্ষতার সাথে লিখিত সিমডি কোডটি বীট না মারলেও তারা সহজেই নিষ্পাপ প্রচেষ্টাগুলিকে পরাজিত করে। এগুলি হয়ত সেই পর্যায়ে উন্নতি করতে পারে যেখানে আমাদের আর এটি ম্যানুয়ালি করতে হবে না, বা অন্তত অন্তর্নির্ভর লেখার ক্ষেত্রে বা স্ট্রেট-আপ অ্যাসেম্বলি কোড (সম্ভবত কেবলমাত্র একটি সামান্য মানবিক দিকনির্দেশনা) লেখার মতো ম্যানুয়াল না পেয়ে without
আবার যদিও, মেমরি বিন্যাস ছাড়া ভেক্টরাইজড প্রসেসিংয়ের পক্ষে দক্ষ, সিমডি অকেজো। আমরা কেবলমাত্র একটি স্কেলার ক্ষেত্রকে একটি বিস্তৃত রেজিস্টারে লোড করব কেবলমাত্র এটিতে একটি অপারেশন করার জন্য। এই সমস্ত আইটেমের কেন্দ্রে সত্যিকারের দক্ষ হওয়ার জন্য মেমরির বিন্যাসের উপর নির্ভরতা depend
অন্যান্য অপ্টিমাইজেশন
এগুলি প্রায়শই আমি পরামর্শ দিই যে আমরা আজকাল "মাইক্রো" কল করা শুরু করি যদি শব্দটি কেবল অ্যালগরিদমিক ফোকাসের বাইরে না গিয়ে পরিবর্তনের দিকেও যায় যা পারফরম্যান্সে ক্ষুদ্র প্রভাব ফেলে।
প্রায়শই শাখার পূর্বাভাসের জন্য অপ্টিমাইজ করার চেষ্টা করার জন্য অ্যালগরিদম বা মেমরির দক্ষতার পরিবর্তন প্রয়োজন যেমন, যদি স্থির পূর্বাভাসের জন্য কেবল ইঙ্গিতগুলি এবং পুনরায় ব্যবস্থা করার চেষ্টা করা হয়, তবে কেবলমাত্র এই জাতীয় কোডটির প্রথমবারের সম্পাদনকে উন্নত করার ঝোঁক রয়েছে, যদি প্রভাবগুলি প্রশ্নবিদ্ধ হয় তবে প্রায়শই তুচ্ছ নয়।
পারফরম্যান্সের জন্য মাল্টিথ্রেডিংয়ে ফিরে যান
যাইহোক, একটি পারফরম্যান্স প্রসঙ্গে মাল্টিথ্রেডিং কতটা গুরুত্বপূর্ণ? আমার 4-কোর মেশিনে, এটি আদর্শভাবে প্রায় 5 গুণ দ্রুত জিনিস তৈরি করতে পারে (হাইপারথ্রেডিং দিয়ে আমি কী পেতে পারি)। আমার সহকর্মীর কাছে এটি 32 টি কোরের জন্য যথেষ্ট গুরুত্বপূর্ণ হবে। এবং এটি আগামী বছরগুলিতে ক্রমবর্ধমান গুরুত্বপূর্ণ হয়ে উঠবে।
সুতরাং এটি বেশ গুরুত্বপূর্ণ। তবে মেমরির দক্ষতা যদি লকগুলিকে অল্প ব্যবহার করতে দেয় না, মিথ্যা ভাগাভাগি কমাতে পারে না ইত্যাদি সমস্যা সমাধানের জন্য কেবল একগুচ্ছ থ্রেড ফেলে দেওয়া অযথা less
পারফরম্যান্সের বাইরে মাল্টিট্রেডিং
মাল্টিথ্রেডিং সবসময় সরল কর্মক্ষমতা সম্পর্কে কোনও সরল প্রত্যয়যুক্ত থ্রুপুট ধরণের অর্থে হয় না। কখনও কখনও এটি ব্যবহারকারীর প্রতিক্রিয়াশীলতা উন্নত করতে থ্রিপুট সম্ভাব্য ব্যয়ে এমনকি ভারের ভারসাম্য বজায় রাখার জন্য ব্যবহার করা হয়, বা জিনিসগুলি সমাপ্ত হওয়ার জন্য অপেক্ষা না করে ব্যবহারকারীকে আরও মাল্টিটাস্কিং করার অনুমতি দেওয়ার জন্য (উদাহরণস্বরূপ: একটি ফাইল ডাউনলোড করার সময় ব্রাউজিং চালিয়ে যাওয়া)।
এই ক্ষেত্রে, আমি পরামর্শ দিচ্ছি যে মাল্টিথ্রেডিং শীর্ষের দিকেও সম্ভবত আরও উপরে উঠেছে (সম্ভবত মেমরির দক্ষতার উপরেও), কারণ এটি তখন হার্ডওয়্যার থেকে সর্বাধিক উপার্জনের পরিবর্তে ব্যবহারকারীর শেষ নকশা সম্পর্কে। এটি প্রায়শই ইন্টারফেস ডিজাইনগুলিকে প্রভাবিত করতে চলেছে এবং যেভাবে আমরা আমাদের পুরো কোডবেজটিকে এই জাতীয় পরিস্থিতিতে দেখায়।
যখন আমরা কোনও বিশাল ডেটা স্ট্রাকচার অ্যাক্সেস করে কোনও টাইট লুপটির সমান্তরালতা না করি, তখন মাল্টিথ্রেডিং সত্যই শক্তিশালী "ডিজাইন" বিভাগে যায় এবং নকশা সর্বদা বাস্তবায়নকে ট্রাম্প করে।
সুতরাং এই ক্ষেত্রে, আমি বলব যে মাল্টিথ্রেডিং সম্মুখভাগ বিবেচনা করা একেবারে সমালোচিত, এমনকি মেমরির প্রতিনিধিত্ব এবং অ্যাক্সেসের চেয়েও বেশি।