কখন, যদি কখনও হয় তবে লুপ আনرولিং এখনও কার্যকর?


94

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

// Search for elements to swap.
while(myArray[++index1] < pivot) {}
while(pivot < myArray[--index2]) {}

আমি এই জাতীয় কিছুতে তালিকাভুক্ত করার চেষ্টা করেছি:

while(true) {
    if(myArray[++index1] < pivot) break;
    if(myArray[++index1] < pivot) break;
    // More unrolling
}


while(true) {
    if(pivot < myArray[--index2]) break;
    if(pivot < myArray[--index2]) break;
    // More unrolling
}

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


4
আমি জিজ্ঞাসা করতে পারি আপনি কেন স্ট্যান্ডার্ড লাইব্রেরি কুইকোর্টের রুটিন ব্যবহার করছেন না?
পিটার আলেকজান্ডার

16
@ পোয়েটা: আমার যে পরিসংখ্যান সংক্রান্ত গণনা করছি তার জন্য আমার কিছু অতিরিক্ত বৈশিষ্ট্য রয়েছে যা আমার ব্যবহারের ক্ষেত্রে খুব বেশি সুরযুক্ত এবং তাই সাধারণের চেয়ে কম তবে পরিমিতরূপে দ্রুতগতির চেয়ে খুব দ্রুত b আমি ডি প্রোগ্রামিং ভাষাটি ব্যবহার করছি, যার একটি পুরানো ক্রেপি অপটিমাইজার রয়েছে এবং এলোমেলো ফ্লোটের বৃহত অ্যারেগুলির জন্য, আমি এখনও জিসিসির সি ++ এসটিএল বাছাই 10-10% দ্বারা পরাজিত করেছি।
dsimcha

উত্তর:


125

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

একটি সহজ উদাহরণ:

for (int i=0; i<n; i++)
{
  sum += data[i];
}

এখানে যুক্তিগুলির নির্ভরতা শৃঙ্খলা খুব ছোট short আপনি যদি স্টল পান কারণ ডেটা-অ্যারেতে আপনার ক্যাশে মিস রয়েছে সিপিইউ অপেক্ষা করা ছাড়া আর কিছুই করতে পারে না।

অন্যদিকে এই কোড:

for (int i=0; i<n; i+=4)
{
  sum1 += data[i+0];
  sum2 += data[i+1];
  sum3 += data[i+2];
  sum4 += data[i+3];
}
sum = sum1 + sum2 + sum3 + sum4;

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


4
ধন্যবাদ আমি লাইব্রেরির অন্যান্য কয়েকটি স্থানে যেখানে এই অঙ্কগুলি এবং জিনিসপত্র গণনা করছি এবং এই জায়গাগুলিতে এটি বিস্ময়কর কাজ করে আমি এই স্টাইলে লুপ আনرولল করার চেষ্টা করেছি। আমি প্রায় নিশ্চিত কারণটি হ'ল এটি আপনার নির্দেশ অনুসারে নির্দেশ স্তরের সমান্তরালতা বৃদ্ধি করে।
dsimcha

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

4
মনে রাখবেন যে এইভাবে কোনও অঙ্কের গণনা করার সময় ফলাফলটি মূল লুপের সাথে সংখ্যাগতভাবে অভিন্ন হবে না।
বড়বাস

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

4
@ নীল: খুব বেশি নয়; মূলধারার x86 ওও সিপিইউ এখনও কোর 2 / নেহালেম / কে 10 এর মতো যথেষ্ট। ক্যাশে মিসের পরে ধরা পড়া এখনও বেশ ছোটখাটো ছিল, এফপি বিলম্বিতিকে আড়াল করা এখনও সবচেয়ে বড় সুবিধা ছিল। ২০১০ সালে, সিপিইউ যেগুলি প্রতি ঘড়ি প্রতি 2 লোড করতে পারে তা এমনকি বিরল ছিল (কেবল এএমডি কারণ এসএনবি এখনও প্রকাশিত হয়নি), সুতরাং একাধিক সংগ্রহকারী এখনকার চেয়ে অবশ্যই পূর্ণসংখ্যার কোডের জন্য কম মূল্যবান ছিল (অবশ্যই এটি স্কেলার কোড যা অটো-ভেক্টরাইজ করা উচিত সুতরাং, কে জানে যে কম্পাইলাররা একাধিক সংযোজককে ভেক্টর উপাদানগুলিতে পরিণত করবে বা একাধিক ভেক্টর আহরণকারীগুলিতে পরিণত করবে ...)
পিটার কর্ডেস

26

এগুলি কোনও পার্থক্য করবে না কারণ আপনি একই সংখ্যার তুলনা করছেন। এখানে আরও একটি ভাল উদাহরণ। পরিবর্তে:

for (int i=0; i<200; i++) {
  doStuff();
}

লিখুন:

for (int i=0; i<50; i++) {
  doStuff();
  doStuff();
  doStuff();
  doStuff();
}

তারপরেও এটি অবশ্যই কার্যকর হবে না তবে আপনি এখন 200 এর পরিবর্তে 50 তুলনা করছেন (তুলনাটি আরও জটিল imagine

সাধারণভাবে ম্যানুয়াল লুপ আনرولিং মূলত ইতিহাসের একটি নিদর্শন an এটি ক্রমবর্ধমান তালিকার আরেকটি বিষয় যা কোনও গুরুত্বপূর্ণ সংকলক আপনার পক্ষে যখন এটি গুরুত্বপূর্ণ তখন তা করবে। উদাহরণস্বরূপ, বেশিরভাগ লোকেরা লিখতে x <<= 1বা x += xপরিবর্তে বিরক্ত করে না x *= 2। আপনি কেবল লিখুন x *= 2এবং সংকলক এটি সর্বোত্তম যা আপনার জন্য এটি অনুকূল করে তুলবে।

মূলত আপনার সংকলকটির দ্বিতীয়-অনুমান করার প্রয়োজন কম।


4
@ মাইকে নিশ্চয়ই অপ্টিমাইজেশনটি বন্ধ করছে যদি কোনও ভাল ধারণা হতবাক হয়ে যায় তবে পোয়েটা_ যে লিঙ্কটি পোস্ট করেছে তা পড়া ভাল। সংকলকরা ব্যবসায়টিতে বেদনাদায়কভাবে ভাল পাচ্ছেন ।
dmckee --- প্রাক্তন-মডারেটর বিড়ালছানা

17
@ মাইক "আমি কখন এই জিনিসগুলি কখন না করবো তা সিদ্ধান্ত নিতে পুরোপুরি সক্ষম" ... আমি সন্দেহ করি, যদি না আপনি অতিমানব হন।
মিঃ বয়

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

4
আমি নিশ্চিত যে এটি খুব কঠিন নয়, তবে আমি এখনও সন্দেহ করি যে আপনি এটি কম্পাইলারের মতো দ্রুত করতে পারেন। সংকলক যেভাবে আপনার জন্য এটি করায় সমস্যা কি? আপনি যদি এটি পছন্দ না করেন তবে কেবল অপটিমাইজেশন বন্ধ করুন এবং আপনার সময়কে 1990 এর মতো জ্বালিয়ে দিন!
মিঃ বয়

4
লুপ আন্রোলিংয়ের কারণে পারফরম্যান্স লাভের যে তুলনাগুলি আপনি সংরক্ষণ করছেন তার সাথে কোনও সম্পর্ক নেই। কিছু না.
বোবোগো

14

আধুনিক হার্ডওয়্যারগুলিতে শাখার পূর্বাভাস নির্বিশেষে, বেশিরভাগ সংকলকগণ যাইহোক আপনার জন্য লুপ আনরোলিং করে।

আপনার সংকলকটি আপনার জন্য কতটা অপ্টিমাইজেশন করে তা সন্ধান করা সার্থক হবে।

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


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

4
"হাতের অনুকূলকরণ প্রায়শই কার্যকর হয় না" you're আপনি যদি কার্যটিতে সম্পূর্ণ নতুন হন তবে সম্ভবত এটি সত্য। কেবল অন্যথায় সত্য নয়।
Veedrac

4
২০১২ সালে আমি এখনও কম্পাইলারের স্বয়ংক্রিয় প্রচেষ্টার তুলনায় যথেষ্ট লাভ সহ ম্যানুয়াল তালিকাভুক্তিগুলি করেছি ... সুতরাং এটি কম্পাইলারটিকে সমস্ত কিছু করার পক্ষে এটি নির্ভরযোগ্য নয়। মনে হচ্ছে এটি প্রায়শই আনرول করা যায় না। কমপক্ষে সি # এর জন্য আমি সমস্ত ভাষার পক্ষে কথা বলতে পারি না।
ডাব্লুডিউউ

2

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

সংকলনের সময় বা লুপে প্রবেশের পরে যাদের পুনরাবৃত্তির সংখ্যা নির্ধারণ করা যেতে পারে লুপগুলি আনرول করুন।

সুতরাং, অনুশীলনে সম্ভবত আপনার সংকলকটি আপনার জন্য তুচ্ছ ঘটনাগুলি করবে। আপনার লুপগুলি যতটা সম্ভব সম্ভব কতগুলি পুনরাবৃত্তির প্রয়োজন হবে তা নির্ধারণ করার জন্য সংকলকটির পক্ষে সহজ তা নিশ্চিত করা আপনার পক্ষে।


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

2

লুপ আনরোলিং, এটি হাতের তালিকাভুক্ত হওয়া বা সংকলক আনرولিং হোক না কেন, প্রায়শই পাল্টা উত্পাদনশীল হতে পারে, বিশেষত সাম্প্রতিক x86 সিপিইউগুলির সাথে (কোর 2, কোর আই 7)। নীচের লাইন: আপনি এই কোডটি মোতায়েন করার পরিকল্পনা করেন এমন সিপিইউগুলির সাথে এবং লুপকে তালিকাভুক্ত না করে আপনার কোডটি বেঞ্চমার্ক করুন।


বিশেষত রিসিট x86 সিপিইউতে কেন?
জনআর্টুগো

7
@ জোহনটোর্টুগো: আধুনিক x86 সিপিইউগুলিতে ছোট লুপগুলির জন্য কিছু নির্দিষ্ট আশা রয়েছে - দেখুন উদাহরণস্বরূপ কোর এবং নেহালেম অ্যাচটিচারগুলিতে লুপ স্ট্রিম ডিটেক্টর - একটি লুপ আন্রোলিং করা যাতে এটি আর অপ্টিমাইজেশনটিকে পরাভূত করে এলএসডি ক্যাশে থাকা ফিট করার মতো ছোট নয়। উদাহরণস্বরূপ দেখুন tomshardware.com/reviews/Intel-i7-nehalem-cpu,2041-3.html
পল আর

1

না জেনে চেষ্টা করা উপায় নয়।
এই সাজানোর সামগ্রিক সময়ের একটি উচ্চ শতাংশ নেয়?

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

সর্বাধিক পারফরম্যান্স কীভাবে পাবেন তার একটি উদাহরণ এখানে।


1

লুপ তালিকাভুক্তি নির্দিষ্ট ক্ষেত্রে সহায়ক হতে পারে। একমাত্র লাভ কিছু পরীক্ষা বাদ দিচ্ছে না!

উদাহরণস্বরূপ এটি স্কেলার প্রতিস্থাপন, সফ্টওয়্যার উপস্থাপনের দক্ষ সন্নিবেশের অনুমতি দিতে পারে ... আক্রমণাত্মকভাবে তালিকাভুক্তি না করে আপনি আশ্চর্য হবেন যে এটি কতটা কার্যকর হতে পারে (আপনি বেশিরভাগ লুপগুলিতে এমনকি 10% স্পিডআপ পেতে পারেন)

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


0

লুপ আনرولিং সম্পূর্ণরূপে আপনার সমস্যার আকারের উপর নির্ভর করে। এটি আপনার অ্যালগরিদমকে ছোট ছোট কাজের আকারে আকার হ্রাস করতে সক্ষম হওয়ার উপর সম্পূর্ণ নির্ভরশীল। আপনি উপরেরটি যা করেছেন তা দেখে মনে হচ্ছে না। আমি নিশ্চিত নই যে কোনও মন্টি কার্লো সিমুলেশন এমনকি অনিয়ন্ত্রিতও হতে পারে।

লুপ আনরোলিংয়ের জন্য আমার ভাল দৃশ্যটি একটি চিত্র ঘোরানো হবে। যেহেতু আপনি কাজের আলাদা গ্রুপ ঘোরান। এটি কাজ করতে আপনাকে পুনরাবৃত্তির সংখ্যা হ্রাস করতে হবে।


আমি একটি দ্রুত সাজানোর তালিকাভুক্ত ছিল যা সিমুলেশনটির প্রধান লুপ নয়, আমার সিমুলেশনের অভ্যন্তরীণ লুপ থেকে কল হয়ে যায়।
dsimcha

0

লুপের সাথে এবং সাথে উভয়ই স্থানীয় ভেরিয়েবল থাকলে লুপ আনরোলিং এখনও কার্যকর useful লুপ ইনডেক্সের জন্য একটি সংরক্ষণের পরিবর্তে reg নিবন্ধগুলি পুনরায় ব্যবহার করতে।

আপনার উদাহরণে, আপনি স্থানীয় ভেরিয়েবলগুলি অল্প পরিমাণে ব্যবহার করেন, নিবন্ধগুলিকে অতিরিক্ত ব্যবহার না করে।

তুলনাটি ভারী (অর্থাত্ testনির্দেশ না দেওয়া) তুলনা (লুপ শেষ পর্যন্ত) এছাড়াও একটি প্রধান অসুবিধা , বিশেষত যদি এটি বাহ্যিক ক্রিয়াকলাপের উপর নির্ভর করে।

লুপ আন্রোলিং শাখার পূর্বাভাসের জন্য সিপিইউর সচেতনতা বাড়াতে সহায়তা করে, তবে সেগুলি যাইহোক ঘটে।

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