একাধিক কোরের জন্য প্রোগ্রামিংয়ে আমাদের কতটা প্রচেষ্টা ব্যয় করা উচিত?


12

প্রসেসররা আজকাল আরও বেশি করে কোর পাচ্ছেন, যা আমাকে অবাক করে দিয়ে চলেছে ...

আমাদের, প্রোগ্রামারদের এই আচরণের সাথে খাপ খাইয়ে নেওয়া উচিত এবং একাধিক কোরের জন্য প্রোগ্রামিংয়ে আরও প্রচেষ্টা করা উচিত?

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

উত্তর:


15

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

আপনার যদি আপনার অ্যাপ্লিকেশনটি মাল্টি-থ্রেডড করা প্রয়োজন তবে আপনার প্রয়োজনীয় থ্রেড তৈরি করুন এবং সংকলক এবং ওএসকে তাদের কাজগুলি দিয়ে দিন।

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

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


3
তবে একটি থ্রেড ক্রমাগতভাবে একটি কোর থেকে অন্য দিকে ঝাঁপিয়ে পড়লে পারফরম্যান্সের জরিমানা হবে (প্রথম এবং দ্বিতীয় স্তরের সিপিইউ ক্যাশে মিস হওয়ার কারণে), বিশেষত এমন স্থাপত্যগুলিতে যেখানে দুটি স্বতন্ত্র শারীরিক মৃত্যু হয় নিযুক্ত করা হয়। মাল্টিথ্রেডেড ইনটেনসিভ কোডে, সখ্যতা একটি ভাল জিনিস।
উইজার্ড 79

@ লোরেঞ্জো - সেক্ষেত্রে আপনাকে দেখতে হবে যে আপনি থ্রেডটিকে একটি একক কোরতে বেঁধে রাখতে পারেন - যা সম্ভবত একটি বিশেষ ক্ষেত্রে - তবে একটি আকর্ষণীয়।
ChrisF

1
ওএসের প্রসঙ্গটি কী একটি ক্রিয়াকলাপকে অন্য একটি কোর থেকে অন্য একটিতে সরিয়ে নিয়ে যাওয়া উচিত নয়?
জেবিআরউইলকিনসন

আমি @ জেবিআরউইলকিনসনের সাথে একমত, থ্রেড অ্যাফিনিটি আমার কাছে কোনও ওএস কাজ বলে মনে হচ্ছে।
কলিন

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

5

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

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

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


5

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

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

অনেক ভাষা এবং ফ্রেমওয়ার্ক একই ধারণা আছে।


5

শক্ত অংশটি হ'ল আপনার সিপিইউ নিবিড় অ্যালগরিদমকে মৃত্যুদন্ড কার্যকর করার অংশগুলিতে ভাগ করে নেওয়া।

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


3

আমরা এখন (অক্টোবর ২০১০) বিপুল সংক্রমণের সময়ে আছি।

আমরা আজ একটি 12 কোর ডেস্কটপ কিনতে পারি।
আমরা আজ একটি 448 কোর প্রসেসিং কার্ড কিনতে পারি (এনভিডিয়া টেসলার সন্ধান করুন)।

আমাদের প্রোগ্রামগুলি অদূর ভবিষ্যতে এর মধ্যে যে সমান্তরাল পরিবেশের কাজ করবে তার অজানাতে আমরা কতটা বিকাশকারীরা কাজ করতে পারি তার সীমাবদ্ধতা রয়েছে।

অপারেটিং সিস্টেম, রানটাইম এনভায়রনমেন্ট এবং প্রোগ্রামিং লাইব্রেরি কেবল এত কিছু করতে পারে।

ভবিষ্যতে, নতুন। নেট "টাস্ক ফ্রেমওয়ার্ক" এর মতো বিমূর্ততা ব্যবহার করে আমাদের প্রসেসিংকে স্বতন্ত্র প্রক্রিয়াকরণের জন্য পৃথক অংশগুলিতে বিভাজন করা দরকার।

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


3

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

বেশিরভাগ ক্ষেত্রে, যখন সমান্তরালতার প্রয়োজন হয় তখন লক, থ্রেড এবং কার্য এবং টাস্ক পুলগুলির একটি শক্ত বোঝাপড়া এবং ব্যবহার একটি ভাল শুরু হবে। (ল্যাং / লিব অনুসারে পরিবর্তিত হয়)

আপনার যে নকশাগুলি অবশ্যই তৈরি করতে হবে তার মধ্যে যে পার্থক্য রয়েছে তা যুক্ত করুন - অনিয়ন্ত্রিত মাল্টিপ্রসেসিংয়ের জন্য একজনকে প্রায়শই বেশ কয়েকটি নতুন প্রোগ্রামিং মডেল বা সমান্তরাল কৌশল শিখতে হবে। সেক্ষেত্রে, শেখার সময়, শক্ত বোঝাপড়া করার জন্য পর্যাপ্ত সময় ব্যর্থ হওয়া এবং বিদ্যমান প্রোগ্রামগুলি আপডেট করতে একটি দলকে এক বছর (বা আরও) সময় লাগতে পারে। আপনি যখন এই পর্যায়ে পৌঁছে গেছেন, আপনি (আশাবাদী!) আজকের মতো সমস্যাগুলি / বাস্তবায়নের বিষয়টি অনুধাবন করবেন না বা কাছে পৌঁছে যাবেন না (তবে আপনি এখনও সেই রূপান্তরটি তৈরি না করে থাকেন)।

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

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

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

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

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

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


2

আমরা করি, তবে আমরা গণনা ভারী সফ্টওয়্যার লিখি তাই আমরা একাধিক কোর থেকে সরাসরি উপকৃত হব।

কখনও কখনও শিডিয়ুলার কোরগুলির মধ্যে অনেকগুলি থ্রেড সরিয়ে দেয়। যদি তা গ্রহণযোগ্য না হয় তবে আপনি মূল সান্নিধ্যের সাথে খেলতে পারেন।


0

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

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

মাল্টি-থ্রেডেড প্রোগ্রামিংয়ের জন্য আপনি দেখতে পাবেন যে আপনি আপনার পারফরম্যান্সে হ্রাসকারী রিটার্ন পাবেন; আপনি ঘন্টা ব্যয় করতে এবং 15% দ্বারা প্রোগ্রামটি উন্নত করতে পারেন এবং তারপরে আরও একটি সপ্তাহ ব্যয় করতে পারেন এবং কেবল এটি আরও 5% দ্বারা উন্নত করতে পারেন।

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