পারফরম্যান্সের উন্নতির জন্য প্রায়শই কেন মাল্টিথ্রেডিং পছন্দ করা হয়?


23

আমার একটি প্রশ্ন আছে, এটি কেন প্রোগ্রামাররা সাধারণভাবে একত্রে এবং বহু-থ্রেড প্রোগ্রাম পছন্দ করে।

আমি এখানে 2 টি প্রধান পন্থা বিবেচনা করছি:

  • মূলত সিগন্যালের উপর ভিত্তি করে একটি অ্যাসিঙ্ক পদ্ধতির উপর ভিত্তি করে, বা যেমন নতুন সি # 5.0 এর মতো অনেকগুলি কাগজপত্র এবং ভাষাগুলির দ্বারা ডাকা একটি অ্যাসিঙ্ক পদ্ধতি এবং আপনার পাইপলাইনের নীতি পরিচালনা করে এমন একটি "সহযোগী থ্রেড"
  • একটি সমবর্তী পদ্ধতির বা বহু-থ্রেডিং পদ্ধতির

আমি কেবল বলব যে আমি এখানে হার্ডওয়্যার এবং সবচেয়ে খারাপ পরিস্থিতি সম্পর্কে ভাবছি এবং আমি এই 2 টি দৃষ্টান্তটি নিজেই পরীক্ষা করে দেখেছি, অ্যাসিঙ্ক দৃষ্টান্তটি এমন এক বিজয়ী যে আমি কেন 90% লোককে পাই না মাল্টি থ্রেডিং সম্পর্কে কথা বলুন যখন তারা জিনিসগুলিকে গতি বাড়িয়ে দিতে বা তাদের সংস্থানগুলির একটি ভাল ব্যবহার করতে চায়।

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

অন্যদিকে, অ্যাসিঙ্কের একটি ভাল পদ্ধতি সম্ভবত দ্রুত নয় তবে এটি সবচেয়ে খারাপ নয়, আমার অ্যাপ্লিকেশনটি কেবল ফলাফলের জন্য অপেক্ষা করে এবং স্তব্ধ হয় না, এটি প্রতিক্রিয়াশীল এবং আরও অনেক ভাল স্কেলিং চলছে।

আমি এটিও আবিষ্কার করেছি যে থ্রেডিং জগতের একটি প্রসঙ্গে পরিবর্তন এটি বাস্তব বিশ্বের দৃশ্যে এতটা সস্তা নয়, এটি আসলে বেশ ব্যয়বহুল, বিশেষত যখন আপনার কাছে 2 টিরও বেশি থ্রেড থাকে যেগুলি একে অপরকে গণনা করার জন্য চক্র এবং অদলবদলের প্রয়োজন।

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

আমি যা যুগপত পদ্ধতির অভিজ্ঞতা পেয়েছি তা তত্ত্বের ক্ষেত্রে ভাল তবে অনুশীলনে তেমন ভাল নয়, হার্ডওয়্যার দ্বারা চাপানো মেমরির মডেলটি সহ, এই দৃষ্টান্তটির একটি ভাল ব্যবহার করা শক্ত, এটি ব্যবহার থেকে শুরু করে অনেকগুলি বিষয়ও প্রবর্তন করে একাধিক থ্রেডের যোগদানের জন্য আমার ডেটা স্ট্রাকচারের।

এছাড়াও কার্যকরী দৃষ্টিকোণ থেকে কার্যকরী দৃষ্টিভঙ্গি থেকে সত্যই অনুরূপ হয়ে ওঠার পরে যখন কাজ বা কাজটি একটি নির্দিষ্ট সময়ে করা হবে তখন উভয় দৃষ্টান্ত কোনও সুরক্ষার প্রস্তাব দেয় না।

এক্স ৮ memory মেমোরি মডেল অনুসারে, কেন বেশিরভাগ লোকেরা কেবল অ্যাসিঙ্ক পদ্ধতির পরিবর্তে সি ++ এর সাথে একত্রে ব্যবহারের পরামর্শ দেয়? এছাড়াও কেন এমন কম্পিউটারের সবচেয়ে খারাপ পরিস্থিতি বিবেচনা করবেন না যেখানে প্রসঙ্গের স্যুইচ সম্ভবত গণনার তুলনায় আরও ব্যয়বহুল?


2
তুলনা করার একটি উপায় হ'ল জাভাস্ক্রিপ্ট বিশ্বের দিকে নজর দেওয়া, যদি কোনও থ্রেডিং না থাকে এবং সমস্ত কিছু আগ্রাসীভাবে অ্যাসিঙ্ক্রোনাস থাকে, কলব্যাকগুলি ব্যবহার করে। এটি কাজ করে তবে এর নিজস্ব সমস্যা রয়েছে।
রোবট

2
@ স্টেভেনবার্ন্যাপ আপনি ওয়েব কর্মীদের কী বলে?
user16764

2
"এমনকি ২-৩-১৫ এর মতো অপেক্ষাকৃত কম সংখ্যক থ্রেডও সমস্যা হতে পারে, অ্যাপ্লিকেশনটি প্রতিক্রিয়াহীন এবং কেবল ধীর এবং অপ্রীতিকর।" => এটি থ্রেডগুলির দুর্বল নকশা / অনুপযুক্ত ব্যবহারের কারণে হতে পারে। আপনার থ্রেডগুলি ডেটা এক্সচেঞ্জ রাখার সময় আপনি সাধারণত সেই ধরণের পরিস্থিতি খুঁজে পান, এক্ষেত্রে মাল্টি থ্রেডিং সঠিক উত্তর নাও হতে পারে বা আপনাকে ডেটা পুনরায় বিভাজন করার প্রয়োজন হতে পারে।
Assylias

1
@ এ্যাসিয়ালিয়াস ইউআই থ্রেডে উল্লেখযোগ্য ধীরগতি দেখতে থ্রেডগুলিতে অতিরিক্ত পরিমাণে লকিংয়ের ইঙ্গিত দেয়। আপনার হয় হয় একটি দুর্বল বাস্তবায়ন বা আপনি একটি বৃত্তাকার খোসা একটি বৃত্তাকার গর্ত মধ্যে পাউন্ড করার চেষ্টা করছেন।
ইভান প্লেস

5
আপনি বলছেন "প্রোগ্রামাররা একত্রে এবং একাধিক থ্রেডেড প্রোগ্রামগুলি সাধারণভাবে পছন্দ করে" আমি সন্দেহ করি। আমি বলব "প্রোগ্রামাররা এটি ঘৃণা করে" ... তবে প্রায়শই এটি করা একমাত্র দরকারী জিনিস ...
johannes

উত্তর:


34

আপনার একাধিক কোর / প্রসেসর রয়েছে, সেগুলি ব্যবহার করুন

এসিঙ্ক হয় ভারী CPU- র আবদ্ধ প্রক্রিয়াকরণ সম্পর্কে ভারী আই আবদ্ধ প্রক্রিয়াকরণের কিন্তু কি করছেন জন্য শ্রেষ্ঠ?

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

একটি বহু-থ্রেড অ্যাপ্লিকেশনটিতে, সিপিইউ-ইনটেনসিভ টাস্কগুলি (প্রিন্ট জব প্রাক্তন) ইউআই থ্রেড মুক্ত করে একটি পটভূমি কর্মী থ্রেডে প্রেরণ করা যেতে পারে।

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

অনুশীলনে, অ্যাসিঙ্ক এবং মাল্টি-থ্রেডেড / প্রসেস কোডগুলির প্রত্যেকটির সুবিধা এবং ত্রুটি রয়েছে।

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

উদাহরণ:

  • স্টোরেজ (অ্যামাজন এস 3, গুগল ক্লাউড ড্রাইভ) সিপিইউ-তে আবদ্ধ
  • ওয়েব সার্ভারগুলি আইও আবদ্ধ (অ্যামাজন ইসি 2, গুগল অ্যাপ ইঞ্জিন)
  • ডাটাবেস দুটিই, সিপিইউ রাইটিং / ইনডেক্সিং এবং আইও আবদ্ধের জন্য আবদ্ধ

এটিকে দৃষ্টিকোণে রাখতে ...

ওয়েবসার্ভার এমন প্ল্যাটফর্মের একটি নিখুঁত উদাহরণ যা দৃO়ভাবে IO আবদ্ধ। একটি সংযুক্তি প্রতি এক থ্রেড নির্ধারণ করে এমন একটি মাল্টি-থ্রেডযুক্ত ওয়েবসার্ভার ভাল স্কেল করে না কারণ ভাগ করা সংস্থাগুলিতে প্রসঙ্গের স্যুইচিং এবং থ্রেড লকিংয়ের পরিমাণ বাড়ার কারণে প্রতিটি থ্রেড বেশি ওভারহেডে প্রবেশ করে। যেখানে একটি অ্যাসিঙ্ক ওয়েবসভারটি একটি একক ঠিকানার স্থান ব্যবহার করবে।

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

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

বহু-থ্রেডযুক্ত, বহু-প্রক্রিয়া এবং অ্যাসিঙ্ক মডেলগুলির মধ্যে বছরের পর বছর ধরে প্রচুর ধর্মীয় যুদ্ধ হয়েছে। সর্বাধিক বিষয়গুলির মতোই সেরা উত্তরটি হওয়া উচিত, "এটি নির্ভর করে।"

এটি একই ধরণের চিন্তাভাবনার অনুসরণ করে যা জিপিইউ এবং সিপিইউ আর্কিটেকচারকে সমান্তরালে ব্যবহার করে ন্যায়সঙ্গত করে। কনসার্টে চলছে দুটি বিশেষায়িত সিস্টেমের একক একাকী পদ্ধতির চেয়ে অনেক বেশি উন্নতি হতে পারে।

উভয়ই এর ব্যবহার আছে বলে ভাল হয় না। কাজের জন্য সেরা সরঞ্জামটি ব্যবহার করুন।

হালনাগাদ:

আমি অ্যাপাচে রেফারেন্সটি সরিয়েছি এবং একটি ছোটখাটো সংশোধন করেছি। অ্যাপাচি একটি মাল্টিপ্রসেস মডেল ব্যবহার করে যা কার্নেল স্তরে প্রসঙ্গের স্যুইচিংয়ের পরিমাণ বাড়ানোর প্রতিটি অনুরোধের জন্য একটি প্রক্রিয়া কাঁধে দেয়। এছাড়াও, যেহেতু মেমরিটি প্রক্রিয়াগুলি জুড়ে ভাগ করা যায় না, প্রতিটি অনুরোধের জন্য অতিরিক্ত মেমরির ব্যয় হয়।

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

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

Update2:

নেটওয়ার্ক (যেমন সকেট) যোগাযোগের চেয়ে দ্রুত আইপিসি সম্পর্কে কম্বল স্টেটমেন্টের বিপরীতে। এটা সবসময় হয় না । মনে রাখবেন যে এগুলি সাধারণীকরণ এবং বাস্তবায়ন-নির্দিষ্ট বিশদগুলির ফলাফলের উপর বিশাল প্রভাব ফেলতে পারে।


কেন একজন প্রোগ্রামার মাল্টি-প্রসেসে যেতে হবে? আমি বোঝাতে চাইছি 1 টিরও বেশি প্রক্রিয়ার সাথে আপনারও এমন একধরণের আন্ত-প্রক্রিয়া যোগাযোগ প্রয়োজন যা একটি গুরুত্বপূর্ণ ওভারহেড যুক্ত করতে পারে, এটি কি পুরানো উইন্ডোজ-প্রোগ্রামার পদ্ধতিগুলি করার মতো? আমি কখন মাল্টি-প্রসেসে যেতে পারি? আপনার জবাবের জন্য ধন্যবাদ, অ্যাসিঙ্ক এবং মাল্টি-থ্রেড কীসের জন্য সত্যিই ভাল ছবি।
ব্যবহারকারী 1849534

1
আপনি ধরে নিচ্ছেন যে আন্তঃসংযোগ যোগাযোগ সামগ্রিক ওভারহেড বাড়িয়ে তুলবে। তবে যদি প্রক্রিয়াজাতকরণের অবস্থা অপরিবর্তনীয় হয় বা কেবল শুরু / সমাপ্তির পরে সিঙ্ক্রোনাইজেশন পরিচালনা করতে হয়। এটি আরও সমান্তরাল কার্যগুলিতে ফ্যান আউট করা আরও কার্যকর হতে পারে। অভিনেতা প্যাটার্ন একটি ভাল উদাহরণ, এবং আপনি যদি এটি সম্পর্কে পড়েন না - এটি সত্যিই পড়া উচিত। akka.io
sylvanaar

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

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

(নিয়মিত) তবে, সত্যি বলতে যদি আমার অনেকগুলি সিপিইউ-বাউন্ড প্রসেসিং সক্ষমতার প্রয়োজন হয় আমি অভিনেতার মডেলটি এড়িয়ে এনে এটি একাধিক নেটওয়ার্কিং নোডগুলিতে স্কেলিং করতে সক্ষম করে গড়ে তুলতাম। আমি এর জন্য সবচেয়ে ভাল সমাধানটি দেখেছি হ'ল 0MQ এর টাস্ক ভেন্টিলেটর মডেলটি সকেট-স্তর যোগাযোগের মাধ্যমে ব্যবহার করা। চিত্র 5 @ zguide.zeromq.org/page: সমস্ত দেখুন
ইভান প্লেস

13

মাইক্রোসফ্টের অ্যাসিনক্রোনাস অ্যাপ্রোচ মাল্টিথ্রেডেড প্রোগ্রামিংয়ের সর্বাধিক সাধারণ উদ্দেশ্যে একটি ভাল বিকল্প: আইও কাজের ক্ষেত্রে সাড়া জাগানো improving

যাইহোক, এটি উপলব্ধি করা জরুরী যে অ্যাসিনক্রোনাস পন্থা মোটেও পারফরম্যান্সের উন্নতি করতে, বা সিপিইউ নিবিড় কাজের ক্ষেত্রে প্রতিক্রিয়াশীলতা উন্নত করতে সক্ষম নয়।

প্রতিক্রিয়াশীলতার জন্য বহুবিধ পড়া

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

একইভাবে, একটি জটিল গণনা সম্পাদন করার সময়, আপনি নিয়মিত প্রসঙ্গের স্যুইচিংকে অনুমতি দিতে চান যাতে ইউআই প্রতিক্রিয়াশীল থাকতে পারে এবং ব্যবহারকারী মনে করেন না যে প্রোগ্রামটি ক্র্যাশ হয়েছে।

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

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

"অ্যাসিনক্রোনাস" বিকল্প

"অ্যাসিনক্রোনাস অ্যাপ্রোচ" একক থ্রেডের মধ্যে প্রসঙ্গের স্যুইচ সক্ষম করে এই ছবিটিকে পরিবর্তন করে। এটি গ্যারান্টি দেয় যে আমাদের সমস্ত কাজ একক সিপিইউতে চলবে এবং কম থ্রেড তৈরি / ক্লিনআপ এবং থ্রেডগুলির মধ্যে আরও কম প্রকৃত প্রসঙ্গের সুইচগুলির ক্ষেত্রে কিছু পরিমিত কর্মক্ষমতা উন্নতি সরবরাহ করতে পারে।

নেটওয়ার্ক রিসোর্সের প্রাপ্তির অপেক্ষার জন্য একটি নতুন থ্রেড তৈরি করার পরিবর্তে (উদাহরণস্বরূপ কোনও চিত্র ডাউনলোড করা) একটি asyncপদ্ধতি ব্যবহার করা হয়, যা awaitচিত্রটি উপলব্ধ হয় এবং এর মধ্যে, কলিং পদ্ধতিতে উপার্জন করে।

এখানে প্রধান সুবিধাটি হ'ল আপনার অজানা এড়ানো যেমন থ্রেডিং বিষয়গুলি নিয়ে উদ্বিগ্ন হওয়ার দরকার নেই, কারণ আপনি লক এবং সিঙ্ক্রোনাইজেশন মোটেও ব্যবহার করছেন না, এবং প্রোগ্রামার ব্যাকগ্রাউন্ড থ্রেড স্থাপন এবং ফিরে আসার জন্য কিছুটা কম কাজ আছে there's ইউআই থ্রেডে যখন ফলাফলটি ফিরে আসে নিরাপদে ইউআই আপডেট করার জন্য।

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

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

পারফরম্যান্সের জন্য মাল্টিথ্রেডিং

যেহেতু আপনি "পারফরম্যান্স" সম্পর্কে কথা বলছেন, তাই আমি আরও আলোচনা করতে চাই যে মাল্টিথ্রেডিং কীভাবে পারফরম্যান্স লাভের জন্য ব্যবহার করা যেতে পারে, এটি এমন একক যা একক থ্রেডযুক্ত অ্যাসিনক্রোনাস পদ্ধতির সাথে সম্পূর্ণ অসম্ভব।

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

তুচ্ছ সমান্তরালতা

অবশ্যই, কখনও কখনও মাল্টিথ্রেডিং থেকে বাস্তব গতিপথ পাওয়া সহজ হতে পারে।

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

পারফরম্যান্স জন্য পারফরমাল মাল্টিথ্রেডিং

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

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

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

কয়েকটি কার্যনির্ভরতা রয়েছে এমন কাজগুলি সন্ধান করুন এবং এটি আপনার প্রোগ্রামের রানটাইমের একটি উল্লেখযোগ্য অংশ গ্রহণ করছে।

যদি তাদের কোনও আন্তঃনির্ভরতা না থাকে, তবে এটি তুচ্ছ সমান্তরালতার ঘটনা, আপনি সহজেই প্রতিটিকে একটি সুতার সাহায্যে সেট আপ করতে পারেন এবং সুবিধাগুলি উপভোগ করতে পারেন।

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

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

যাইহোক, থ্রেডগুলি প্রোফাইল করতে নিশ্চিত হন এবং নিশ্চিত হন যে তারা কোনও পর্যায়ে ব্যয় করতে যথেষ্ট কাজ করছে।

সমান্তরাল অ্যালগরিদম

একাধিক প্রসেসর ব্যবহার করে অনেকগুলি সমস্যাও বাড়ানো যেতে পারে, তবে এটি সিপিইউগুলির মধ্যে বিভক্ত হয়ে ওঠার পক্ষে একচেটিয়া।

সমান্তরাল অ্যালগরিদমগুলি তাদের বিগ-ও রানটাইমগুলির জন্য সর্বাধিক উপলভ্য নন-প্যারালাল অ্যালগরিদমের প্রতি সাবধানতার সাথে বিশ্লেষণ করতে হবে, কারণ আন্তঃ-সিপিইউ যোগাযোগ ব্যয়ের পক্ষে একাধিক সিপিইউ ব্যবহার থেকে কোনও সুবিধা হ্রাস করা খুব সহজ। সাধারণভাবে, তাদের প্রতিটি সিপিইউতে গণনার তুলনায় কম আন্তঃ-সিপিইউ যোগাযোগ (বিগ-ও ক্ষেত্রে) অবশ্যই ব্যবহার করতে হবে।

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


একটি সুস্পষ্টভাবে সুচিন্তিত উত্তরের জন্য +1। যদিও আমি মাইক্রোসফ্টের পরামর্শগুলি ফেস ভ্যালুতে নিতে সাবধানতা দেব। মনে রাখবেন যে .NET একটি সিঙ্ক্রোনাস-ফার্স্ট প্ল্যাটফর্ম, অতএব বাস্তুতন্ত্র আরও উন্নততর সুবিধা / ডকুমেন্টেশন সরবরাহের পক্ষপাতদুষ্ট যেগুলি সিঙ্ক্রোনাস সমাধানগুলি সমর্থন করে। বিপরীতটি নোড.জেএস-এর মতো অ্যাসিঙ্ক-প্রথম প্ল্যাটফর্মের ক্ষেত্রে সত্য হবে
ইভান প্লেইস

3

অ্যাপ্লিকেশনটি প্রতিক্রিয়াহীন এবং কেবল ধীর এবং অপ্রীতিকর।

এবং আপনার সমস্যা আছে। একটি প্রতিক্রিয়াশীল UI কোনও পারফরম্যান্ট অ্যাপ্লিকেশন দেয় না। প্রায়শই বিপরীত। কর্মীদের থ্রেডগুলি তাদের কাজটি করার পরিবর্তে অনেক সময় ইউআই ইনপুট পরীক্ষা করতে ব্যয় করা হয়।

যতক্ষণ পর্যন্ত 'স্রেফ' একটি অ্যাসিঙ্ক পদ্ধতির উপস্থিতি রয়েছে, এটি মাল্টিথ্রেডিং পাশাপাশি বেশিরভাগ পরিবেশে সেই একটি বিশেষ ব্যবহারের ক্ষেত্রে টুইট করেছে । অন্যদের মধ্যে, সেই অ্যাসিঙ্কটি কর্টাইনগুলির মাধ্যমে করা হয় যা সর্বদা একত্রে হয় না।

সত্যই, আমি async অপারেশনগুলি এমনভাবে যুক্তিযুক্তভাবে ব্যবহার করা এবং ব্যবহার করা আরও বেশি কঠিন বলে মনে করি যা আসলে উপকার (কর্মক্ষমতা, দৃ rob়তা, রক্ষণাবেক্ষণযোগ্যতা) এমনকি ... আরও ম্যানুয়াল পদ্ধতির তুলনায় সরবরাহ করে।


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