"সম্ভাব্য" এবং "অসম্ভব" ম্যাক্রোগুলির ব্যবহার কত বেশি?


12

প্রায়শই পরিচিত likelyএবং unlikelyম্যাক্রোগুলি সংকলকটিকে ifসাধারণত কোনও প্রবেশ করা যায় না বা এড়ানো যায় কিনা তা জানতে সাহায্য করে । এটি ব্যবহারের ফলে কিছু (বরং গৌণ) কর্মক্ষমতা উন্নতি হয়।

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

mem = malloc(size);
if (unlikely(mem == NULL))
  goto exit_no_mem;

মনে হচ্ছে ঠিক আছে, তবে ত্রুটি-চেকিং ifবেশিরভাগ ক্ষেত্রে ঘটে এবং ফলস্বরূপ উল্লিখিত ম্যাক্রোগুলির ব্যবহার।

আমার প্রশ্ন হচ্ছে, এটা আছে খুব বেশী হয় likelyএবং unlikelyযে ত্রুটি পরীক্ষা এ ম্যাক্রো if?

আমরা যখন সেখানে থাকি তখন অন্যান্য কোন জায়গাগুলি প্রায়শই ব্যবহৃত হয়?


আমার বর্তমান ব্যবহারে এটি একটি লাইব্রেরিতে রয়েছে যা রিয়েল-টাইম সাবসিস্টেম থেকে বিমূর্ততা তৈরি করে, তাই প্রোগ্রামগুলি আরটিএআই, কিউএনএক্স এবং অন্যদের মধ্যে পোর্টেবল হয়ে উঠবে। এটি বলেছিল যে, বেশিরভাগ ফাংশনগুলি ছোট হয় এবং সরাসরি এক বা দুটি ফাংশন কল করে। অনেকগুলি এমনকি static inlineফাংশন হয়।

সুতরাং, প্রথমত, এটি এমন কোনও অ্যাপ্লিকেশন নয় যা আমি প্রোফাইল করতে পারি। এটি "বোতল-ঘাড় সনাক্তকরণ" করার অর্থবোধ করে না কারণ এটি একটি গ্রন্থাগার, কোনও স্ট্যান্ডেলোন অ্যাপ্লিকেশন নয়।

দ্বিতীয়ত, এটি এমন এক ধরণের "আমি জানি এটি অসম্ভাব্য, আমি পাশাপাশি এটি সংকলককেও বলতে পারি"। আমি সক্রিয়ভাবে এটিকে অপ্টিমাইজ করার চেষ্টা করি না if


7
আমার কাছে মাইক্রো অপ্টিমাইজ করার জন্য ...
রাচেট ফ্রিক

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


@ জেমস, যা কেবল বলেছেন likelyএবং unlikelyবিদ্যমান এবং তারা কী করে। আমি কখনই কোথায় সেগুলি ব্যবহার করা ভাল suggest
শাহবাজ

@ শাহবাজ "যদি শর্তটি প্রায়শই মিথ্যা হয়, তবে মৃত্যুদণ্ড কার্যকর হবে না the মাঝখানে অব্যবহৃত কোডের একটি বিরাট অংশ রয়েছে যা কেবল প্রিফেচিংয়ের কারণে L1i কে দূষিত করে না, এটি শাখার পূর্বাভাসের ক্ষেত্রেও সমস্যা তৈরি করতে পারে If শাখার পূর্বাভাস ভুল, শর্তসাপেক্ষ প্রকাশটি খুব অদক্ষ হতে পারে। সুতরাং, আপনার প্রয়োজনীয় নির্দেশাবলী L1i ক্যাশে রয়েছে তা নিশ্চিত করতে চান এমন কড়া লুপগুলি
জেমস

উত্তর:


12

আপনি কি এমনভাবে এমন পারফর্মেন্সের প্রয়োজন যা আপনি নিজের কোডটি সেই সাথে দূষিত করতে ইচ্ছুক? এটি একটি সামান্য অপ্টিমাইজেশন।

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

আপনি yesউপরের সমস্তটির জবাব না দিতে পারলে এ জাতীয় জিনিস নিয়ে বিরক্ত করবেন না।

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


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

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

3
@ পিটার: যদিও এটি অত্যন্ত খারাপ সিনট্যাক্সটি খুব ভাল নয়, তবে কোড পড়ছেন এমন মানুষের পক্ষে সম্ভবত কি সম্ভাবনা রয়েছে তা কার্যকর তথ্য সরবরাহ করতে পারে সে সম্পর্কে স্বরলিপিগুলি । উদাহরণস্বরূপ, যে কেউ দেখেছেন if (likely(x==2 || x==3)) doOneThing(); else switch(x) { ... }, তারা বিচার করতে পারেন যে প্রোগ্রামারারের if2 এবং 3 এর মানগুলির জন্য একটি ব্যবহার কেবল প্রোগ্রামার এর জানা না থাকার ফলস্বরূপ ছিল না যে সি caseএকটি হ্যান্ডলারের সাথে দুটি লেবেল সংযুক্ত করতে পারে ।
সুপারক্যাট

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

2

আপনি যদি x86 / x64 এর জন্য লিখছেন (এবং 20-বছরের পুরাতন সিপিইউ ব্যবহার করছেন না), __builtin_expect () ব্যবহার করে পারফরম্যান্স লাভ যদি হয় তবে তা নগণ্য হবে। এর কারণটি হ'ল আধুনিক x86 / x64 সিপিইউগুলি (যদিও এটি অ্যাটম সম্পর্কে 100% নিশ্চিত নয়), গতিশীল শাখার পূর্বাভাস রয়েছে, তাই মূলত সিপিইউ শাখাটি সম্পর্কে প্রায়শই "শিখায়" যা প্রায়শই নেওয়া হয়। অবশ্যই, এই তথ্য কেবলমাত্র সীমিত সংখ্যক শাখার জন্য সংরক্ষণ করা যেতে পারে, তবে কেবল দুটি ক্ষেত্রেই সম্ভব। যদি (ক) এটি "ঘন ঘন ব্যবহৃত" শাখা হয়, তবে আপনার প্রোগ্রামটি সেই গতিশীল শাখার পূর্বাভাস থেকে উপকৃত হবে এবং (খ) যদি এটি "বিরল" শাখা হয়, আপনি সত্যিকার অর্থে কোনও ভুল বাস্তবতার কারণে হিট দেখতে পাবেন না এই জাতীয় দুর্লভ শাখা (নীল চাঁদে একবার হলে শাখার ভুল অনুমানের 20 সিপিইউ চক্র খুব খারাপ হয় না)।

নোট: এটি বোঝায় না যে আধুনিক x86 / x64 এর উপর শাখার ভুল অনুমানের গুরুত্ব কম পেয়েছে: জাম্প-নোজাম্পের 50-50 সম্ভাবনাযুক্ত যে কোনও শাখায় এখনও জরিমানা (আইআইআরসি 10-20 সিপিইউ চক্র) লাগতে পারে, সুতরাং অভ্যন্তরীণ লুপগুলিতে শাখা হতে পারে এখনও এড়ানো প্রয়োজন। এটি কেবলমাত্র x86 / x64 এর উপর __builtin_expect () এর গুরুত্ব রয়েছে যা হ্রাস পেয়েছে (আইআইআরসি, প্রায় 10-15 বছর আগে বা তার বেশি) - বেশিরভাগ কারণ গতিশীল শাখার পূর্বাভাস।

এনবি 2: এক্স 86 / এক্স 64, ওয়াইএমএমভি ছাড়িয়ে অন্য প্ল্যাটফর্মগুলির জন্য।


ঠিক আছে, সংকলক জানে যে কোন শাখাটি সিপিইউ কম সম্ভাবনা করবে। এবং এটি যাতে বাস্তবে অসম্ভব হতে পারে তার ব্যবস্থা করতে পারে। তবে সংকলক সম্ভবত ইতিমধ্যে unlikelyনোট ছাড়াই সেই প্যাটার্নটি জানে ।
Deduplicator

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