আধুনিক সিপিইউগুলিতে একক-নিয়োগের এডিটি ওরিয়েন্টেড কোডের পারফরম্যান্স


32

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

তবে আমি এখন কয়েকবার শুনেছি যে পারফরম্যান্সে লোকসানগুলি সিপিইউর (বিশেষত এর মেমরি নিয়ামক) মেমোরিটি পরিবর্তিত হয়নি (তত পরিমাণে) এই উপকারটি গ্রহণ করতে পারে এমন লাভের ফলে লাভগুলি ছাড়িয়ে গেছে।

আমি আশা করছিলাম যে এটি কীভাবে সত্য (বা যদি তা না হয়) তবে কেউ আলোকপাত করতে পারে ।

ইন আরেকটি পোস্টে করা একটি মন্তব্যে উল্লেখ করা হয়েছিল যে সারাংশ ডেটা প্রকার (এডিটি এর) এই যা আমাকে আরও জানতে আগ্রহী তৈরি সঙ্গে কাজ করতে, have কিভাবে ADTs বিশেষভাবে পথ মেমরির CPU- র ডিল প্রভাব না? এটি অবশ্য একদিকেই, বেশিরভাগ ক্ষেত্রেই আমি কেবলমাত্র আগ্রহী যে কীভাবে ভাষার শুদ্ধতা সিপিইউ এবং এর ক্যাশে ইত্যাদির কার্যকারিতাকে প্রয়োজনীয়ভাবে প্রভাবিত করে etc.


2
এটি মাল্টিথ্রেডিংয়ে বেশিরভাগ ক্ষেত্রে কার্যকর, যেখানে পাঠক পরমাণুভাবে একটি স্ন্যাপশট ধরতে পারে এবং জ্ঞানটি সুরক্ষিত রাখতে পারে যে এটি পড়ার সময় তা পরিবর্তন হবে না
ratchet freak

@ratchetfreak আমি প্রোগ্রামিং দৃষ্টিকোণ থেকে এটি পেয়েছি যে আপনার কোডটি আরও সুরক্ষার গ্যারান্টি পেয়েছে, তবে আমার কৌতূহল সিপিইউতে থাকা মেমরি নিয়ামক সম্পর্কে এবং এই আচরণটি কীভাবে এটির জন্য গুরুত্বপূর্ণ (বা যদি তা না হয়) যেমন আমি দাবী শুনেছি প্রায় এক হাত পূর্ণ যা বলেছিল যে এটি মেমরির নিয়ামকের জন্য আরও দক্ষ and এবং নিম্ন স্তরের বিশদটি আমি ঠিক জানি না এটি কীভাবে বা এটি সত্য হতে পারে তা বলতে পারি।
জিমি হোফা 17

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

1
আমি এটিও উল্লেখ করতে চাই যে অপরিবর্তনীয় কাঠামো ব্যবহার করার সময় মেমরির দক্ষতা অপরিহার্যভাবে সংকলক অনুকূলিতকরণের উপর নির্ভর করতে হবে না। এই উদাহরণে let a = [1,2,3] in let b = 0:a in (a, b, (-1):c)শেয়ারিং মেমরির পরিমাণ হ্রাস করা যাবে, কিন্তু সংজ্ঞা উপর নির্ভর করে (:)এবং []এবং কম্পাইলার। আমি মনে করি? এই একটি বিষয়ে নিশ্চিত না।

উত্তর:


28

সিপিইউ (এটির মেমরি নিয়ন্ত্রক বিশেষত) মেমরিটি পরিবর্তিত হয় না সেটির সুবিধা নিতে পারে

সুবিধাটি হ'ল, ডেটা অ্যাক্সেস করা হয়ে গেলে এই ঘটনাটি মেম্বার নির্দেশাবলী ব্যবহার করা থেকে সংকলককে সংরক্ষণ করে ।

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

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


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

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

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

কিছুটা সরল করে নীচের নোটটি দেখুন , এখানে মেম্বারের জন্য মাল্টি-কোর প্রসেসরে কী ঘটে:

  1. সমস্ত কোর প্রক্রিয়াজাতকরণ বন্ধ করে দেয় - দুর্ঘটনাক্রমে ক্যাশে লেখার বিষয়টি এড়াতে।
  2. স্থানীয় ক্যাশে করা সমস্ত আপডেট বিশ্বব্যাপী একটিতে লিখিত হয় - এটি নিশ্চিত করতে যে বিশ্বব্যাপী ক্যাশে সাম্প্রতিক ডেটা রয়েছে। এটি কিছুটা সময় নেয়।
  3. স্থানীয় ক্যাশে সর্বাধিক সাম্প্রতিক ডেটা রয়েছে তা নিশ্চিত করার জন্য - আপডেট হওয়া ডেটা গ্লোবাল ক্যাশে থেকে স্থানীয় লোকগুলিতে লেখা থাকে। এটি কিছুটা সময় নেয়।
  4. সমস্ত কোর পুনরায় কার্যকর করা কার্যকর করে।

আপনি দেখতে পাচ্ছেন, সমস্ত কোর সমস্ত কিছুই করছে না যখন বৈশ্বিক এবং স্থানীয় ক্যাশেগুলির মধ্যে পিছনে পিছনে ডেটা অনুলিপি করা হচ্ছে । পরিবর্তনীয় ডেটা সঠিকভাবে সিঙ্ক্রোনাইজ হয়েছে (থ্রেড নিরাপদ) তা নিশ্চিত করার জন্য এটি প্রয়োজনীয়। যদি 4 টি কোর থাকে তবে সমস্ত 4 টি থামুন এবং ক্যাচগুলি সিঙ্ক করার সময় অপেক্ষা করুন। যদি 8 থাকে তবে সমস্ত 8 টি থামবে। যদি এখানে 16 হয় ... তবে এর মধ্যে একটিতে প্রয়োজনীয় জিনিসগুলির জন্য অপেক্ষা করার সময় আপনি 15 টি কোর পেয়েছেন ঠিক তেমন কিছু করছেন না।

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

সংকলকটির জন্য, এর পরিবর্তে এর অর্থ একটি মেম্বার নির্দেশ সন্নিবেশ করার দরকার নেই

ফলস্বরূপ, ডেটা অ্যাক্সেসের জন্য কোরগুলি থামানো এবং অপেক্ষা করতে হবে না যখন বৈশ্বিক এবং স্থানীয় ক্যাশের মধ্যে ডেটা সামনে এবং পিছনে লেখা হচ্ছে। এটি মেমরির পরিবর্তিত হয় না এর একটি সুবিধা


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



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