মাইক্রোসফ্টের অ্যাসিনক্রোনাস অ্যাপ্রোচ মাল্টিথ্রেডেড প্রোগ্রামিংয়ের সর্বাধিক সাধারণ উদ্দেশ্যে একটি ভাল বিকল্প: আইও কাজের ক্ষেত্রে সাড়া জাগানো improving
যাইহোক, এটি উপলব্ধি করা জরুরী যে অ্যাসিনক্রোনাস পন্থা মোটেও পারফরম্যান্সের উন্নতি করতে, বা সিপিইউ নিবিড় কাজের ক্ষেত্রে প্রতিক্রিয়াশীলতা উন্নত করতে সক্ষম নয়।
প্রতিক্রিয়াশীলতার জন্য বহুবিধ পড়া
প্রতিক্রিয়াশীলতার জন্য মাল্টিথ্রেডিং হ'ল ভারী আইও কর্ম বা ভারী গণনা কার্যকালে কোনও প্রোগ্রামকে প্রতিক্রিয়াশীল রাখার traditionalতিহ্যগত উপায়। আপনি ফাইলগুলি একটি পটভূমির থ্রেডে সংরক্ষণ করেন, যাতে হার্ডড্রাইভটির কাজ শেষ করার জন্য অপেক্ষা না করেই ব্যবহারকারী তাদের কাজ চালিয়ে যেতে পারে। আইও থ্রেড প্রায়শই কোনও লেখার কিছু অংশ শেষ হওয়ার অপেক্ষায় অবরুদ্ধ থাকে, তাই প্রসঙ্গের স্যুইচগুলি ঘন ঘন হয়।
একইভাবে, একটি জটিল গণনা সম্পাদন করার সময়, আপনি নিয়মিত প্রসঙ্গের স্যুইচিংকে অনুমতি দিতে চান যাতে ইউআই প্রতিক্রিয়াশীল থাকতে পারে এবং ব্যবহারকারী মনে করেন না যে প্রোগ্রামটি ক্র্যাশ হয়েছে।
এখানে লক্ষ্যটি সাধারণভাবে বিভিন্ন সিপিইউতে একাধিক থ্রেড চালানো নয়। পরিবর্তে, আমরা কেবল দীর্ঘ-চলমান ব্যাকগ্রাউন্ড টাস্ক এবং ইউআইয়ের মধ্যে কনটেক্সট সুইচগুলি পেতে আগ্রহী, যাতে ব্যাকগ্রাউন্ড টাস্ক চলাকালীন ইউআই আপডেট করতে এবং ব্যবহারকারীর প্রতিক্রিয়া জানাতে সক্ষম হয়। সাধারণভাবে, ইউআই খুব বেশি সিপিইউ শক্তি গ্রহণ করবে না এবং থ্রেডিং ফ্রেমওয়ার্ক বা ওএস সাধারণত সেগুলি একই সিপিইউতে চালানোর সিদ্ধান্ত নেবে।
কনটেক্সট স্যুইচিংয়ের অতিরিক্ত ব্যয়ের কারণে আমরা সামগ্রিক কর্মক্ষমতা হারাতে চাইছি, তবে আমাদের যত্ন নেই কারণ সিপিইউর কার্য সম্পাদন আমাদের লক্ষ্য ছিল না। আমরা জানি যে আমাদের সাধারণত আমাদের প্রয়োজনের চেয়ে বেশি সিপিইউ শক্তি থাকে এবং তাই মাল্টিথ্রেডিংয়ের বিষয়ে আমাদের লক্ষ্য ব্যবহারকারীর সময় নষ্ট না করে ব্যবহারকারীর জন্য একটি কাজ করা।
"অ্যাসিনক্রোনাস" বিকল্প
"অ্যাসিনক্রোনাস অ্যাপ্রোচ" একক থ্রেডের মধ্যে প্রসঙ্গের স্যুইচ সক্ষম করে এই ছবিটিকে পরিবর্তন করে। এটি গ্যারান্টি দেয় যে আমাদের সমস্ত কাজ একক সিপিইউতে চলবে এবং কম থ্রেড তৈরি / ক্লিনআপ এবং থ্রেডগুলির মধ্যে আরও কম প্রকৃত প্রসঙ্গের সুইচগুলির ক্ষেত্রে কিছু পরিমিত কর্মক্ষমতা উন্নতি সরবরাহ করতে পারে।
নেটওয়ার্ক রিসোর্সের প্রাপ্তির অপেক্ষার জন্য একটি নতুন থ্রেড তৈরি করার পরিবর্তে (উদাহরণস্বরূপ কোনও চিত্র ডাউনলোড করা) একটি async
পদ্ধতি ব্যবহার করা হয়, যা await
চিত্রটি উপলব্ধ হয় এবং এর মধ্যে, কলিং পদ্ধতিতে উপার্জন করে।
এখানে প্রধান সুবিধাটি হ'ল আপনার অজানা এড়ানো যেমন থ্রেডিং বিষয়গুলি নিয়ে উদ্বিগ্ন হওয়ার দরকার নেই, কারণ আপনি লক এবং সিঙ্ক্রোনাইজেশন মোটেও ব্যবহার করছেন না, এবং প্রোগ্রামার ব্যাকগ্রাউন্ড থ্রেড স্থাপন এবং ফিরে আসার জন্য কিছুটা কম কাজ আছে there's ইউআই থ্রেডে যখন ফলাফলটি ফিরে আসে নিরাপদে ইউআই আপডেট করার জন্য।
আমি প্রযুক্তিগত বিবরণগুলিতে খুব গভীরভাবে লক্ষ্য করি নি, তবে আমার ধারণাটি হ'ল মাঝেমধ্যে হালকা সিপিইউ ক্রিয়াকলাপের সাথে ডাউনলোডটি পরিচালনা করা আলাদা থ্রেডের জন্য নয়, বরং ইউআই ইভেন্টের সারিতে কোনও কাজের মতো আরও কিছু হয়ে যায় when ডাউনলোড সম্পূর্ণ হয়, অ্যাসিঙ্ক্রোনাস পদ্ধতিটি ইভেন্টের সারি থেকে পুনরায় শুরু করা হয়। অন্য কথায়, এর await
অর্থ যা "আমার প্রয়োজনীয় ফলাফলটি পাওয়া যায় কিনা তা যাচাই করার অনুরূপ কিছু, যদি না হয় তবে আমাকে এই থ্রেডের টাস্ক কাতারে ফিরিয়ে দিন"।
নোট করুন যে এই পদ্ধতির কোনও সিপিইউ-নিবিড় কাজটির সমস্যার সমাধান হবে না: অপেক্ষা করার মতো কোনও ডেটা নেই, সুতরাং আমরা কোনও প্রকৃত ব্যাকগ্রাউন্ড কর্মী থ্রেড তৈরি না করে আমাদের প্রসঙ্গের সুইচগুলি পেতে পারি না। অবশ্যই, ব্যাকগ্রাউন্ড থ্রেড শুরু করতে এবং ফলাফলটি ফেরত দিতে অ্যাসিক্রোনাস পদ্ধতিটি ব্যবহার করা এখনও সুবিধার হতে পারে, এমন একটি প্রোগ্রামে যা বিচ্ছিন্নভাবে অ্যাসিনক্রোনাস পদ্ধতির ব্যবহার করে।
পারফরম্যান্সের জন্য মাল্টিথ্রেডিং
যেহেতু আপনি "পারফরম্যান্স" সম্পর্কে কথা বলছেন, তাই আমি আরও আলোচনা করতে চাই যে মাল্টিথ্রেডিং কীভাবে পারফরম্যান্স লাভের জন্য ব্যবহার করা যেতে পারে, এটি এমন একক যা একক থ্রেডযুক্ত অ্যাসিনক্রোনাস পদ্ধতির সাথে সম্পূর্ণ অসম্ভব।
আপনি যখন এমন পরিস্থিতিতে রয়েছেন যেখানে আপনার কোনও সিপিইউতে পর্যাপ্ত সিপিইউ শক্তি নেই এবং আপনি পারফরম্যান্সের জন্য মাল্টিথ্রেডিং ব্যবহার করতে চান, আসলে এটি করা প্রায়শই কঠিন। অন্যদিকে, যদি কোনও সিপিইউ পর্যাপ্ত প্রক্রিয়াকরণ শক্তি না হয় তবে এটি প্রায়শই একমাত্র সমাধান যা আপনার প্রোগ্রামকে একটি যুক্তিসঙ্গত সময়সীমায় যা করতে চান তা করতে সক্ষম করে তোলে যা এই কাজটিকে সার্থক করে তোলে।
তুচ্ছ সমান্তরালতা
অবশ্যই, কখনও কখনও মাল্টিথ্রেডিং থেকে বাস্তব গতিপথ পাওয়া সহজ হতে পারে।
যদি আপনার কাছে প্রচুর পরিমাণে স্বতন্ত্র গণনা-নিবিড় কাজগুলি ঘটে থাকে (অর্থাত ফলাফলগুলি নির্ধারণের জন্য যে গণনাগুলি সম্পাদন করতে হবে তার সাথে সম্পর্কিত যেগুলির ইনপুট এবং আউটপুট ডেটা খুব ছোট) তবে আপনি প্রায়শই উল্লেখযোগ্য গতি অর্জন করতে পারেন থ্রেডের একটি পুল তৈরি করা (উপলভ্য সিপিইউগুলির সংখ্যার ভিত্তিতে যথাযথ আকারের আকার) এবং মাস্টার থ্রেডটি কাজ বিতরণ করে ফলাফল সংগ্রহ করে।
পারফরম্যান্স জন্য পারফরমাল মাল্টিথ্রেডিং
আমি নিজেকে একজন বিশেষজ্ঞের চেয়ে বেশি হিসাবে রাখতে চাই না, তবে আমার ধারণাটি হ'ল, সাধারণভাবে, আজকাল ঘটে যাওয়া পারফরম্যান্সের জন্য বেশিরভাগ ব্যবহারিক মাল্টিথ্রেডিং এমন একটি অ্যাপ্লিকেশনের জায়গাগুলি খুঁজছেন যা তুচ্ছ সমান্তরালতা রাখে এবং একাধিক থ্রেড ব্যবহার করে বেনিফিট কাটা।
যে কোনও অপ্টিমাইজেশনের মতো, আপনার প্রোগ্রামটির কার্য সম্পাদন, এবং গরম দাগগুলি চিহ্নিত করার পরে এটি অপ্টিমাইজ করা ভাল: এই অংশটি একটি থ্রেডে চালানো উচিত এবং অন্য অংশে অন্য অংশে চালানো উচিত তা নির্বিচারে সিদ্ধান্ত নিয়ে একটি প্রোগ্রামকে ধীর করা সহজ উভয় অংশই সিপিইউ সময়ের একটি উল্লেখযোগ্য অংশ গ্রহণ করছে কিনা তা প্রথমে নির্ধারণ করুন।
একটি অতিরিক্ত থ্রেডের অর্থ আরও সেটআপ / টিয়ারডাউন খরচ, এবং হয় আরও প্রসঙ্গ সুইচ বা আরও আন্তঃ সিপিইউ যোগাযোগের ব্যয় costs যদি কোনও পৃথক সিপিইউতে যদি এই ব্যয়গুলি সার্থক করতে যথেষ্ট কাজ না করে থাকে এবং প্রতিক্রিয়াশীলতার কারণে আলাদা থ্রেড হওয়ার দরকার না থাকে তবে এটি কোনও লাভ ছাড়াই জিনিসগুলি ধীর করে দেবে।
কয়েকটি কার্যনির্ভরতা রয়েছে এমন কাজগুলি সন্ধান করুন এবং এটি আপনার প্রোগ্রামের রানটাইমের একটি উল্লেখযোগ্য অংশ গ্রহণ করছে।
যদি তাদের কোনও আন্তঃনির্ভরতা না থাকে, তবে এটি তুচ্ছ সমান্তরালতার ঘটনা, আপনি সহজেই প্রতিটিকে একটি সুতার সাহায্যে সেট আপ করতে পারেন এবং সুবিধাগুলি উপভোগ করতে পারেন।
আপনি যদি সীমাবদ্ধ আন্তঃনির্ভরতার সাথে কাজগুলি সন্ধান করতে পারেন, যাতে তথ্য আদান-প্রদানের জন্য লকিং এবং সিঙ্ক্রোনাইজেশন তাদের উল্লেখযোগ্যভাবে হ্রাস করে না, তবে মাল্টিথ্রেডিং কিছু গতিবেগ দিতে পারে, তবে আপনি যদি সিঙ্ক্রোনাইজ করার সময় ত্রুটিযুক্ত যুক্তির কারণে অচলাবস্থার বিপদগুলি এড়াতে সতর্ক হন বা যখন প্রয়োজন হয় তখন সিঙ্ক্রোনাইজ না হওয়ার কারণে ভুল ফলাফল।
বিকল্পভাবে, মাল্টিথ্রিডিংয়ের জন্য কয়েকটি সাধারণ অ্যাপ্লিকেশনগুলি পূর্বনির্ধারিত অ্যালগরিদমের গতিসম্পন্ন খুঁজছেন (এক অর্থে) নয়, পরিবর্তে অ্যালগরিদমের জন্য আরও বড় বাজেটের জন্য তারা লেখার পরিকল্পনা করছেন: আপনি যদি গেম ইঞ্জিন লিখছেন , এবং আপনার এআই আপনার ফ্রেম রেটের মধ্যে সিদ্ধান্ত নিতে হবে, আপনি প্রায়শই আপনার এআইকে একটি বড় সিপিইউ চক্র বাজেট দিতে পারেন যদি আপনি এটির নিজস্ব সিপিইউ দিতে পারেন।
যাইহোক, থ্রেডগুলি প্রোফাইল করতে নিশ্চিত হন এবং নিশ্চিত হন যে তারা কোনও পর্যায়ে ব্যয় করতে যথেষ্ট কাজ করছে।
সমান্তরাল অ্যালগরিদম
একাধিক প্রসেসর ব্যবহার করে অনেকগুলি সমস্যাও বাড়ানো যেতে পারে, তবে এটি সিপিইউগুলির মধ্যে বিভক্ত হয়ে ওঠার পক্ষে একচেটিয়া।
সমান্তরাল অ্যালগরিদমগুলি তাদের বিগ-ও রানটাইমগুলির জন্য সর্বাধিক উপলভ্য নন-প্যারালাল অ্যালগরিদমের প্রতি সাবধানতার সাথে বিশ্লেষণ করতে হবে, কারণ আন্তঃ-সিপিইউ যোগাযোগ ব্যয়ের পক্ষে একাধিক সিপিইউ ব্যবহার থেকে কোনও সুবিধা হ্রাস করা খুব সহজ। সাধারণভাবে, তাদের প্রতিটি সিপিইউতে গণনার তুলনায় কম আন্তঃ-সিপিইউ যোগাযোগ (বিগ-ও ক্ষেত্রে) অবশ্যই ব্যবহার করতে হবে।
এই মুহুর্তে, এটি এখনও জটিলভাবে বিশ্লেষণের প্রয়োজনীয়তার জন্য বেশিরভাগ ক্ষেত্রে একাডেমিক গবেষণার একটি জায়গা, কারণ কিছুটা তুচ্ছ সমান্তরালতা বেশ সাধারণ, কারণ আমাদের কম্পিউটারে এখনও আমাদের এতগুলি সিপিইউ কোর নেই যা সমস্যাগুলি একটি সিপিইউতে যুক্তিসঙ্গত সময় ফ্রেমে সমাধান করা যায় না আমাদের সমস্ত সিপিইউ ব্যবহার করে যুক্তিসঙ্গত সময় ফ্রেমে সমাধান করা যায়।