যখন মেমরি ব্যান্ডউইথ সীমাবদ্ধ গণনা ভাগ করা মেমরি পরিবেশে সঞ্চালিত হয় (উদাঃ ওপেনএমপি, প্রথ্রেডস বা টিবিবি দিয়ে থ্রেডেড), তখন কীভাবে মেমরিটি সঠিকভাবে শারীরিক মেমরির মধ্যে বিতরণ করা যায় তা নিশ্চিত করার দ্বিধা রয়েছে যেমন প্রতিটি থ্রেড বেশিরভাগই একটিতে মেমরি অ্যাক্সেস করে "লোকাল" মেমরি বাস যদিও ইন্টারফেসগুলি পোর্টেবল নয়, বেশিরভাগ অপারেটিং সিস্টেমে থ্রেড অ্যাফিনিটি সেট করার উপায় রয়েছে (যেমন উইন্ডোজে লিনাক্সে pthread_setaffinity_np()
অনেকগুলি পসিক্স সিস্টেমে )। মেমরি শ্রেণিবদ্ধতা নির্ধারণের জন্য hwloc এর মতো লাইব্রেরিও রয়েছে , তবে দুর্ভাগ্যক্রমে, বেশিরভাগ অপারেটিং সিস্টেমগুলি এখনও NUMA মেমরি পলিসি সেট করার উপায় সরবরাহ করে না। লিনাক্স লিবনুমা সহ একটি উল্লেখযোগ্য ব্যতিক্রমsched_setaffinity()
SetThreadAffinityMask()
অ্যাপ্লিকেশনটিকে মেমোরি নীতি এবং পৃষ্ঠা গ্রানুলারিটিতে পৃষ্ঠা মাইগ্রেশন হেরফের করার অনুমতি দেয় (২০০৪ সাল থেকে মূল লাইনে, এইভাবে ব্যাপকভাবে উপলব্ধ)। অন্যান্য অপারেটিং সিস্টেমগুলি আশা করে যে ব্যবহারকারীরা একটি অন্তর্নিহিত "প্রথম স্পর্শ" নীতি পর্যবেক্ষণ করবে।
"প্রথম স্পর্শ" নীতি নিয়ে কাজ করার অর্থ হ'ল কলকারীর তাজা বরাদ্দ মেমোরিতে প্রথম লেখার পরে তারা পরে যে পরিমাণ স্নেহ ব্যবহার করতে চান তারা থ্রেড তৈরি এবং বিতরণ করা উচিত। (খুব কম সিস্টেম এমনভাবে কনফিগার করা আছে যেগুলি malloc()
পৃষ্ঠাগুলি সন্ধান করে, এটি কেবল ত্রুটিযুক্ত হলে এটিগুলি খুঁজে বের করার প্রতিশ্রুতি দেয়, সম্ভবত বিভিন্ন থ্রেড দ্বারা।) এর দ্বারা বোঝানো হয় যে বরাদ্দ ব্যবহারের calloc()
পরে বরাদ্দ দেওয়ার পরে মেমরির তাত্ক্ষণিক ব্যবহার করা বা তাত্ক্ষণিক memset()
ক্ষতিকারক যেহেতু এটি ত্রুটিযুক্ত হবে বরাদ্দ থ্রেড চালিত কোরের মেমরি বাসের মধ্যে সমস্ত মেমরি, একাধিক থ্রেড থেকে মেমরিটি অ্যাক্সেস করা হলে সবচেয়ে খারাপ ক্ষেত্রে মেমরি ব্যান্ডউইথের দিকে নিয়ে যায়। একই সি ++ new
অপারেটরের ক্ষেত্রে প্রযোজ্য যা অনেকগুলি নতুন বরাদ্দ শুরু করার জন্য জোর দেয় (উদাঃ)std::complex
)। এই পরিবেশ সম্পর্কে কিছু পর্যবেক্ষণ:
- বরাদ্দকে "থ্রেড সম্মিলিত" করা যেতে পারে, তবে এখন বরাদ্দটি থ্রেডিং মডেলে মিশ্রিত হয়ে যায় যা গ্রন্থাগারের জন্য অনাকাঙ্ক্ষিত, যা বিভিন্ন থ্রেডিং মডেল (সম্ভবত তাদের নিজস্ব থ্রেড পুলের সাহায্যে ক্লায়েন্টদের সাথে যোগাযোগ করতে পারে) হতে পারে।
- RAII আইডোমেটিক সি +++ এর একটি গুরুত্বপূর্ণ অঙ্গ হিসাবে বিবেচিত, তবে এটি একটি NUMA পরিবেশে মেমরির সম্পাদনের জন্য সক্রিয়ভাবে ক্ষতিকারক বলে মনে হচ্ছে। স্থান নির্ধারণের
new
মাধ্যমেmalloc()
বা রুটিনগুলির মাধ্যমে বরাদ্দ হওয়া মেমরির সাহায্যে ব্যবহার করা যেতে পারেlibnuma
তবে এটি বরাদ্দকরণের প্রক্রিয়াটি পরিবর্তন করে (যা আমি বিশ্বাস করি যে এটি প্রয়োজনীয়)। - সম্পাদনা: অপারেটর সম্পর্কে আমার পূর্ববর্তী বক্তব্যটি
new
ভুল ছিল, এটি একাধিক যুক্তি সমর্থন করতে পারে, চেতন এর উত্তর দেখুন। আমি বিশ্বাস করি যে নির্দিষ্ট সংযুক্তি ব্যবহারের জন্য গ্রন্থাগার বা এসটিএল ধারক পাওয়ার এখনও একটি উদ্বেগ রয়েছে। একাধিক ক্ষেত্রগুলি প্যাক করা হতে পারে এবং এটি নিশ্চিত করতে অসুবিধা হতে পারে, যেমন,std::vector
সঠিক প্রসঙ্গে ম্যানেজারটি সক্রিয় রেখে পুনরায় স্থান গ্রহণ করা। - প্রতিটি থ্রেড তার নিজস্ব ব্যক্তিগত মেমরি বরাদ্দ করতে এবং ত্রুটিযুক্ত করতে পারে তবে তার পরে প্রতিবেশী অঞ্চলে সূচীকরণ আরও জটিল। (একটি ভার্চুয়াল ম্যাট্রিক্স-ভেক্টর পণ্যটি বিবেচনা করুন the ম্যাট্রিক্স এবং ভেক্টরগুলির একটি সারি পার্টিশন সহ একটি ; ভার্চুয়াল মেমরির সাথে সংগতিপূর্ণ না হলে এর অজানা অংশকে সূচিকরণের জন্য আরও জটিল ডেটা কাঠামো প্রয়োজন ))
NUMA বরাদ্দ / ইনিশিয়ালেশনের কোনও সমাধান কি মূর্তিমান? আমি কি অন্যান্য সমালোচকদের হাতছাড়া করেছি?
(আমার সি ++ উদাহরণগুলি সেই ভাষার উপর জোর বোঝানোর জন্য আমি বোঝাতে চাইছি না, তবে সি ++ ভাষা মেমরি পরিচালনা সম্পর্কে এমন কিছু সিদ্ধান্ত এনকোড করে যা সি এর মতো কোন ভাষা নয়, সুতরাং সি ++ প্রোগ্রামাররা সেগুলি করার পরামর্শ দিলে আরও প্রতিরোধের ঝোঁক থাকে) জিনিস অন্যভাবে।)