কোনটি দ্রুত: x << 1 বা x << 10?


84

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

x << 1;

এবং

x << 10;

এবং দয়া করে এই প্রশ্নের জন্য আমাকে ঘৃণা করবেন না। :)


17
ওম, আমি কোডটি একবার দেখেছিলাম এবং আমার প্রথম চিন্তাটি "স্ট্রিম প্রিন্টিং অপারেটর" " আমার একটা বিরতি দরকার.
কোস

4
আমি মনে করি যে আমি কেউ শুনছি তাদের মনের মধ্যে "অকাল অপ্টিমাইজেশন" বেহুদিভাবে বলতে, বা সম্ভবত আমার কল্পনা করা।
tia

4
@tia তিনি বলেছিলেন যে তিনি কিছুই অপ্টিমাইজ করতে যাচ্ছেন না :)

4
@ গ্রিগরি হ্যাঁ এবং সে কারণেই আমরা এখানে কাউকে সেই বাক্যটি দিয়ে প্রশ্নটি এড়াতে দেখি না। : ডি
টিয়া

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

উত্তর:


84

সম্ভাব্য সিপিইউর উপর নির্ভর করে।

তবে, সমস্ত আধুনিক সিপিইউ (x86, এআরএম) একটি "ব্যারেল শিফটার" ব্যবহার করে - একটি হার্ডওয়্যার মডিউল বিশেষত ধ্রুবক সময়ে নির্বিচারে শিফট সম্পাদন করার জন্য ডিজাইন করা।

সুতরাং নীচের লাইন হয় ... না। কোনও পার্থক্য নেই।


21
দুর্দান্ত, এখন আমার সিপিইউকে আমার মাথায় আটকে থাকা ব্যারেল রোল করতে বলার চিত্র রয়েছে ...
Ignacio Vazquez-Abram

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

4
@ চটজলদি_ এখন: নিশ্চিত যে ঘড়ির গতি মাপার একটি খারাপ উপায়। কোনও প্রসেসর আসলে 60,000 শিফট করার মতো বোকা নয়; এটি কেবল রূপান্তরিত হবে 60000 mod register_size। উদাহরণস্বরূপ, একটি 32-বিট প্রসেসর শিফট গণনার 5 টি সর্বনিম্ন উল্লেখযোগ্য বিট ব্যবহার করবে।
ক্যাসাব্ল্যাঙ্কা

4
ইনমোস ট্রান্সপোর্টারটির একটি শিফট অপারেটর ছিল যা শিফটের সংখ্যাটি 32 বিটের অপারেন্ড took আপনি চাইলে প্রতিটি 4 ঘন্টা আপনি 4 বিলিয়ন শিফট করতে পারেন। "কোনও প্রসেসর যথেষ্ট বোকা নয়"। ভুল, দুঃখিত. এই এক করেছে। যদিও আপনাকে সে অংশটি এসেম্বলারের মধ্যে কোড করা দরকার। সংকলকগণ একটি বোধগম্য পরিবর্তন / অপ্টিমাইজেশন করেছেন (ফলাফলটি কেবল 0 তে সেট করুন, কিছুই করবেন না)।
দ্রুত

4
পেন্টিয়াম 4 ব্যারেল শিফটার হারিয়েছে, দুঃখের সাথে, যা তার সামগ্রিক দরিদ্র নির্দেশনা-প্রতি-ঘড়ির হারে অবদান রেখেছিল। আমি ধরে নিয়েছি কোর ব্লাহ আর্কিটেকচারটি এটি ফিরে পেয়েছে।
রাসেল বোরোগোভ

64

কিছু এম্বেড থাকা প্রসেসরের কেবলমাত্র "শিফট-বাই-ওয়ান" নির্দেশনা থাকে। এই জাতীয় প্রসেসরের উপর, সংকলকটি পরিবর্তিত x << 3হবে ((x << 1) << 1) << 1

আমি মনে করি মোটরোলা এমসি H৮ এইচসিএক্সএক্স এই সীমাবদ্ধতার সাথে অন্যতম জনপ্রিয় পরিবার ছিল। ভাগ্যক্রমে, এই জাতীয় স্থাপত্যগুলি এখন বেশ বিরল, বেশিরভাগটিতে এখন একটি পরিবর্তনশীল শিফ্ট আকারের ব্যারেল শিফটার অন্তর্ভুক্ত include

ইন্টেল ৮০৫১, যার অনেকগুলি আধুনিক ডেরাইভেটিভ রয়েছে, এটি একটি বিচ্ছিন্ন সংখ্যক বিট স্থানান্তর করতে পারে না।


12
এম্বেড থাকা মাইক্রোকন্ট্রোলারগুলিতে এখনও সাধারণ।
বেন জ্যাকসন

4
"বিরল" এর নীচে আপনি কী বোঝাতে চাইছেন? পরিসংখ্যান অনুসারে বিক্রি হওয়া 8-বিট মাইক্রোকন্ট্রোলারগুলির সংখ্যা অন্যান্য সমস্ত ধরণের এমপিইউয়ের সংখ্যার চেয়ে বেশি।
ভোভানিয়াম

8-বিট মাইক্রোকন্ট্রোলারগুলি নতুন বিকাশের জন্য খুব বেশি ব্যবহৃত হচ্ছে না, আপনি যখন আরও প্রোগ্রাম রম, আরও বেশি কার্যক্ষম র‌্যাম এবং আরও ক্ষমতা সহ ইউনিট প্রতি একই দামের জন্য (যেমন টিআই থেকে এমএসপি 430) 16-বিট পেতে পারেন। এমনকি কিছু 8-বিট মাইক্রোকন্ট্রোলারগুলিতে ব্যারেল শিফটার রয়েছে।
বেন ভয়েগট

4
একটি মাইক্রোকন্ট্রোলারের শব্দের আকারের ব্যারেল শিফটার রয়েছে কিনা তার সাথে কিছুই করার নেই, আমি যে এমসি H৮ এইচসিএক্সএক্স পরিবার উল্লেখ করেছি তার মধ্যে ১--বিট প্রসেসর রয়েছে, এগুলি সমস্তই একবারে একক বিট পজিশনে স্থানান্তরিত করে।
বেন ভয়েগট

সত্য যে সর্বাধিক 8-বিট এমসিইউগুলির কোনও ব্যারেল শিফটার নেই, যদিও আপনি ঠিক বলেছেন যে এটির জন্য সঠিক কিছু রয়েছে এবং ব্যারেল শিফটার ছাড়া 8-বিট নেই। [আউট] ব্যারেল শিফটারযুক্ত মেশিনগুলির জন্য নির্ভরযোগ্যতা হিসাবে সাক্ষ্য পেয়েছে। এছাড়াও সত্য যে এমসিইউর জন্য সিপিইউ কোর প্রায়শই মডেলের জন্য কোনও পছন্দ সেট করে না, তবে অন-চিপ পেরিফেরিয়ালগুলিও তা করে। এবং 8-বিট প্রায়শই একই দামের জন্য আরও সমৃদ্ধ পেরিফেরিয়ালের জন্য বেছে নেওয়া হয়।
ভোভানিয়াম

29

এ নিয়ে অনেক মামলা রয়েছে।

  1. অনেক হাই-স্পিড এমপিইউগুলির ব্যারেল শিফটার, মাল্টিপ্লেক্সারের মতো বৈদ্যুতিন সার্কিট রয়েছে যা ধ্রুব সময়ে কোনও শিফট করে।

  2. এমপিইউতে যদি কেবলমাত্র 1 বিট শিফট থাকে x << 10তবে এটি সাধারণত ধীর হয়, কারণ এটি প্রায়শই 10 শিফট দ্বারা বা 2 শিফ্ট দিয়ে বাইট অনুলিপি দ্বারা সম্পন্ন হয়।

  3. তবে এমন সাধারণ ঘটনা রয়েছে যা এর চেয়ে x << 10আরও দ্রুততর হবে x << 1। X যদি 16 বিট হয় তবে এর 6 টি কম বিট কেবল কেয়ার (অন্য সবগুলি স্থানান্তরিত হবে), এমপিইউকে কেবলমাত্র নিম্ন বাইট লোড করা প্রয়োজন, সুতরাং কেবলমাত্র 8-বিট মেমরিতে একক অ্যাক্সেস চক্র তৈরি করতে হবে, যখন x << 10দুটি অ্যাক্সেস চক্র প্রয়োজন। যদি অ্যাক্সেস চক্রটি শিফ্টের চেয়ে ধীর হয় (এবং লোয়ার বাইট সাফ করে) x << 10তবে দ্রুত হবে। এটি ধীরে ধীরে বহিরাগত ডেটা র‍্যাম অ্যাক্সেস করার সময় দ্রুত চালিত চালিত চালক প্রোগ্রাম ROM সহ মাইক্রোকন্ট্রোলারদের ক্ষেত্রে প্রয়োগ হতে পারে।

  4. কেস 3 ছাড়াও, x << 10সংকলকটি উল্লেখযোগ্য বিটগুলির সংখ্যার বিষয়ে যত্নশীল হতে পারে এবং নিম্ন-প্রস্থের আরও ক্রিয়াকলাপকে অনুকূল করতে পারে, যেমন 16x8 একের সাথে 16x16 গুণকে প্রতিস্থাপন করার মতো (নিম্ন বাইট সর্বদা শূন্য থাকে)।

দ্রষ্টব্য, কিছু মাইক্রোকন্ট্রোলারের কোনও শিফট-বাম নির্দেশ নেই, তারা add x,xপরিবর্তে ব্যবহার করে।


আমি এটি পাচ্ছি না, কেন x << 10 দ্রুততর তবে x << 8 x x << 8 এ আপনাকে 16 বিট থেকে নিম্ন বাইট থেকে একটি লোড করতে হবে, এবং লোড এবং দুটি শিফ্ট না করা উচিত। আমি এটা পাই না
কেউ

4
@ নন: আমি x << 10 x << 8 এর চেয়ে বেশি দ্রুত বলেছি না।
ভোভানিয়াম

9

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


4
নির্দেশাবলী কি একই চক্রটিতে কার্যকর হয়? কয়েকটি স্থাপত্যে একই নির্দেশনা অপারেশনগুলির উপর ভিত্তি করে কয়েকটি আলাদা অপ-কোডগুলিতে অনুবাদ করবে এবং 1 থেকে 5 চক্র পর্যন্ত যে কোনও জায়গায় নিয়ে যাবে।
নিক টি

@ নিক একটি এআরএম নির্দেশিকা সাধারণত 1 বা 2 চক্রের মধ্যে লাগে। নতুন স্থাপত্যগুলির সাথে নিশ্চিত নয়।
ওয়ানম্যাসে

4
@ নিক টি: তিনি এআরএম সম্পর্কে বলছেন, তাদের উত্সর্গীকৃত নির্দেশনা হিসাবে বদলানো হয়নি, তবে অনেকগুলি ডেটা প্রসেসিং নির্দেশের 'বৈশিষ্ট্য' হিসাবে রয়েছে। আই ADD R0, R1, R2 ASL #3আর 1 যোগ করে এবং আর 2 3 টি বিট বামে স্থানান্তরিত করে।
ভোভানিয়াম


7

এটি সিপিইউ এবং সংকলক উভয়ই নির্ভর করে। এমনকি যদি অন্তর্নিহিত সিপিইউতে ব্যারেল শিফটার সহ নির্বিচারে বিট শিফট থাকে তবে এটি কেবল তখনই ঘটবে যখন সংকলক সেই সংস্থানটির সুযোগ নেয়।

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

এএনএসআই সি বিভাগ 3.3.7 থেকে উদ্ধৃতি:

৩.৩..7 বিটওয়াস শিফট অপারেটর

বাক্য গঠন

      shift-expression:
              additive-expression
              shift-expression <<  additive-expression
              shift-expression >>  additive-expression

সীমাবদ্ধতা

অপারেন্ডগুলির প্রত্যেকের ইন্টিগ্রাল টাইপ থাকবে।

শব্দার্থবিজ্ঞান

অবিচ্ছেদ্য প্রচারগুলি প্রতিটি অপারেন্ডে সম্পাদিত হয়। ফলাফলের ধরণটি হ'ল প্রচারিত বাম অপারেন্ড। যদি ডান অপরেন্ডের মান negativeণাত্মক হয় বা প্রচারিত বাম অপারেন্ডের বিটগুলির প্রস্থের চেয়ে বড় বা সমান হয়, তবে আচরণটি অপরিবর্তিত।

E1 এর ফলাফল << E2 হল E1 বাম-স্থানান্তরিত E2 বিট অবস্থান; শূন্য বিট জিরো দিয়ে ভরা হয়। যদি E1 এর স্বাক্ষরবিহীন প্রকারের থাকে তবে ফলাফলটির মান E1 পরিমাণ দ্বারা গুণিত হয়, 2 পাওয়ার E2 এ উত্থাপিত হয়, E1 টাইপ স্বাক্ষরবিহীন দীর্ঘ না হলে ULONG_MAX + 1 হ্রাস পায়, অন্যথায় অন্যথায় UINT_MAX + 1 হয়। (ধ্রুবকগুলি ULONG_MAX এবং UINT_MAX শিরোনামে সংজ্ঞায়িত করা হয়েছে))

E1 >> E2 এর ফলাফল হ'ল E1 ডান স্থানান্তরিত E2 বিট অবস্থান। যদি E1 এর স্বাক্ষরবিহীন প্রকার থাকে বা E1 এর একটি স্বাক্ষরিত প্রকার এবং একটি nonnegative মান রয়েছে, ফলাফলের মানটি E1 এর ভাগফলের অবিচ্ছেদ্য অংশ, পরিমাণ 2 দ্বারা পাওয়ার ই 2 তে উত্পন্ন হয়। যদি E1 এর একটি স্বাক্ষরিত ধরণ এবং negativeণাত্মক মান থাকে তবে ফলাফল মান বাস্তবায়ন-সংজ্ঞায়িত হয়।

সুতরাং:

x = y << z;

"<<": y × 2 z ( যদি একটি ওভারফ্লো দেখা দেয় তবে সংজ্ঞায়িত );

x = y >> z;

">>": স্বাক্ষরিত জন্য বাস্তবায়ন-সংজ্ঞায়িত (বেশিরভাগ ক্ষেত্রে পাটিগণিত শিফ্টের ফলাফল: y / 2 z )।


আমি মনে করি না 1u << 100ইউবি। এটি মাত্র 0.
আর্মেন ​​সিরুনিয়ান

@ আর্মেন ​​সিরুনিয়ান: বিট শিফট 1u << 100হিসাবে সামান্য শিফট ওভারফ্লো হতে পারে; 1u << 100পাটিগণিত শিফট হিসাবে 0 হয়। এএনএসআই সি এর অধীনে <<কিছুটা শিফট is en.wikedia.org/wiki/Arithmetic_shift
নেকড়ে

4
@ আর্মেন ​​সিরুনিয়ান: এএনএসআই বিভাগ ৩.৩. See দেখুন - ডান অপরেন্ডের মান যদি negativeণাত্মক হয় বা প্রচারিত বাম অপারেণ্ডের বিটগুলির প্রস্থের চেয়ে বড় বা সমান হয়, তবে আচরণটি অনির্ধারিত। সুতরাং আপনার উদাহরণটি কোনও এএনএসআই সি সিস্টেমে ইউবি হয় যদি না 101+ বিট টাইপ থাকে।
নেকড়ে

@ গাজর-পাত্র: ঠিক আছে, আপনি আমাকে বুঝিয়েছিলেন :)
আর্মেন ​​সিরুনিয়ান

সম্পর্কিত: x << (y & 31)সংক্ষেপণ স্থিতিশীল শিফট নির্দেশনা গণনাটি মাস্ক (যদি x86 এর মতো) জেনে থাকে তবে কোনও এবং নির্দেশ ছাড়াই একটি একক শিফট নির্দেশিকাতে সংকলন করতে পারে। (পছন্দসইভাবে মাস্কটিকে হার্ড-কোড করবেন না; এটি থেকে CHAR_BIT * sizeof(x) - 1বা কোনও কিছু পান This) ইনপুট নির্বিশেষে কোনও সি ইউবি ছাড়াই একক নির্দেশনায় সংকলিত একটি ঘোরানো আইডিয়ম লেখার জন্য এটি দরকারী। ( স্ট্যাকওভারফ্লো . com / প্রশ্নগুলি / 67766০৮/২ )।
পিটার

7

এটি অনুমেয় যে 8-বিট প্রসেসরের উপর, 16-বিটের মানের চেয়ে x<<1আসলে অনেক ধীর হতে পারে x<<10

উদাহরণস্বরূপ এর যুক্তিসঙ্গত অনুবাদ x<<1হতে পারে:

byte1 = (byte1 << 1) | (byte2 >> 7)
byte2 = (byte2 << 1)

যদিও x<<10আরও সহজ হবে:

byte1 = (byte2 << 2)
byte2 = 0

x<<1আরও প্রায়শই কীভাবে স্থানান্তরিত হয় এবং এর চেয়ে আরও দূরে লক্ষ্য করুন x<<10। তদ্ব্যতীত ফলাফল x<<10বাইট 1 এর সামগ্রীর উপর নির্ভর করে না। এটি অতিরিক্তভাবে অপারেশনকে গতিতে পারে।


5

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


4
এটি পেন্টিয়াম ৪. পিপিও-উত্পন্ন সিপিইউগুলির (পি 2 এবং পি 3 এর মতো) দ্রুত শিফট রয়েছে। এবং হ্যাঁ, x86-এ পরিবর্তনশীল-গণনা শিফটগুলি যতটা কম হতে পারে তার চেয়ে ধীরে ধীরে, যদি আপনি BMI2 shlx/ shrx/ sarx(হাসওয়েল এবং পরে এবং রাইজেন) ব্যবহার না করতে পারেন । সিআইএসসি শব্দার্থবিজ্ঞান (গণনা = 0 গণনা ছাড়াই পতাকাগুলি) x86 কে আঘাত করেছে। shl r32, clস্যান্ডিব্রিজে-পরিবারে 3 জন উপ (যদিও ইন্টেল দাবি করেছে যে পতাকাটির ফলাফল অব্যবহৃত হলে এটি কোনও উফ বাতিল করতে পারে)। এএমডির সিঙ্গল-উওপ রয়েছে shl r32, cl(তবে প্রসারিত-নির্ভুলতার জন্য ধীর ডাবল শিফট shld r32, r32, cl)
পিটার

4
শিফট (এমনকি ভেরিয়েবল-কাউন্ট) কেবলমাত্র পি 6-পরিবারে একক উওপ, তবে শিফট অবসর গ্রহণ না হওয়া অবধি সামনের প্রান্তের শেষের প্রান্তের শেষেshl r32, cl 1 টি ছাড়া অন্য কোনও স্টল -এর ফলাফল বা তার সাথে সাথে অন্য কোনও স্টল সহ পড়তে হবে ! ( স্ট্যাকওভারফ্লো . com / জিজ্ঞাসা / 100100৫০০৯৯৯ / ))। সংকলকগণ এটি জানেন এবং শিফটের পতাকা ফলাফলটি ব্যবহার না করে পৃথক নির্দেশ ব্যবহার করুন। (তবে এটি সিপিইউগুলিতে নির্দেশনাগুলি নষ্ট করে যেখানে এটি কোনও সমস্যা নয়, দেখুন স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 40354978/… )test
পিটার

3

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

একটি হার্ডওয়্যার শিফট নির্দেশাবলী সংকলনের একমাত্র সংকলকের বিকল্প x<<1নয়, তবে অন্যান্য উত্তরগুলি বেশিরভাগই এটি ধরে নিচ্ছে।


x << 1x+xস্বাক্ষরবিহীন, এবং 2 এর পরিপূরক স্বাক্ষরিত পূর্ণসংখ্যার জন্য ঠিক সমান । কম্পাইলাররা সর্বদা জানে যে তারা কী হার্ডওয়্যার সংকলন করার সময় তারা লক্ষ্যবস্তু করছে, তাই তারা এই জাতীয় কৌশলগুলির সুবিধা নিতে পারে।

ইনটেল হাসওলে অন , addপ্রতি ক্লক থ্রুপুট 4 থাকে তবে shlতাত্ক্ষণিক গণনা সহ প্রতি ঘড়ি থ্রুটপুট থাকে 2। ( নির্দেশাবলী সারণী এবং অন্য লিঙ্কগুলির জন্য http://agner.org/optimize/ দেখুনট্যাগ উইকি)। সিমডি ভেক্টর শিফটগুলি প্রতি ঘড়ি প্রতি 1 (স্কাইলেকে 2), তবে সিমডি ভেক্টর সংখ্যার প্রতি ঘড়ি প্রতি 2 হয় (স্কাইলেকে 3)। প্রচ্ছন্নতা একই, যদিও: 1 চক্র।

shlওপকোডে গণনা অন্তর্ভুক্ত যেখানে রয়েছে সেখানে একটি বিশেষ শিফট বাই ওয়ান এনকোডিং রয়েছে । 8086 এর তাত্ক্ষণিক-গণনা শিফট নেই, কেবলমাত্র এক-এক করে এবং clরেজিস্টার দ্বারা । এটি বেশিরভাগ ক্ষেত্রে ডান-শিফ্টগুলির জন্য প্রাসঙ্গিক, কারণ আপনি যদি কোনও স্মৃতি অপারেণ্ড পরিবর্তন না করেন তবে আপনি কেবল বাম শিফটে যুক্ত করতে পারেন। তবে পরে যদি মানটির প্রয়োজন হয় তবে প্রথমে একটি রেজিস্টারে লোড করা ভাল। তবে যাইহোক, shl eax,1বা এর add eax,eaxচেয়ে এক বাইট কম shl eax,10, এবং কোড-আকার সরাসরি (ডিকোড / ফ্রন্ট-এন্ড বাধা) বা অপ্রত্যক্ষভাবে (এল 1 আই কোড ক্যাশে মিস করে) পারফরম্যান্সকে প্রভাবিত করে।

আরও সাধারণভাবে, ছোট শিফট গণনাগুলি কখনও কখনও x86 এর ঠিকানা ঠিকানাটিতে একটি মাপানো সূচকে অনুকূলিত করা যায়। এই দিনগুলিতে প্রচলিত অন্যান্য বেশিরভাগ আর্কিটেকচার হ'ল আরআইএসসি, এবং স্কেল-ইনডেক্সের ঠিকানা ঠিকানাগুলি নেই, তবে এটি উল্লেখ করার মতো x86 একটি সাধারণ যথেষ্ট আর্কিটেকচার। (ডিম্বানু আপনি যদি 4-বাইট উপাদানের একটি অ্যারে সূচক করে থাকেন তবে স্কেল ফ্যাক্টর 1 এর জন্য 1 বাড়ানোর জায়গা রয়েছে int arr[]; arr[x<<1])।


অনুলিপি + শিফ্টের প্রয়োজন এমন পরিস্থিতিতে সাধারণ যেখানে xএখনও এর মূল মূল্য প্রয়োজন। তবে বেশিরভাগ x86 পূর্ণসংখ্যার নির্দেশাবলী স্থানে কাজ করে। (গন্তব্য addবা এর মতো নির্দেশের জন্য উত্সগুলির মধ্যে একটি shl)) x86-64 সিস্টেম ভি কলিং কনভেনশন রেজিস্টারে আর্গগুলি পাস করে, প্রথম আরগ ইন ediএবং রিটার্ন মান সহ eax, সুতরাং একটি ফাংশন যা x<<10সংকলককে এমিট কপি + শিফট করে তোলে কোড

LEAনির্দেশ আপনি নামান-এবং-যোগ করতে দেয় (কারণ এটা অ্যাড্রেসিং-মোড মেশিন-এনকোডিং ব্যবহার করে, 0 থেকে 3 এর একটি স্থানান্তর গণনা সহ)। এটি ফলাফলকে একটি পৃথক রেজিস্টারে রাখে।

জিডিসি এবং ক্ল্যাং উভয়ই এই ফাংশনগুলিকে একইভাবে অনুকূলিত করে, যেমন আপনি গডবোল্ট সংকলক এক্সপ্লোরারটিতে দেখতে পারেন :

int shl1(int x) { return x<<1; }
    lea     eax, [rdi+rdi]   # 1 cycle latency, 1 uop
    ret

int shl2(int x) { return x<<2; }
    lea     eax, [4*rdi]    # longer encoding: needs a disp32 of 0 because there's no base register, only scaled-index.
    ret

int times5(int x) { return x * 5; }
    lea     eax, [rdi + 4*rdi]
    ret

int shl10(int x) { return x<<10; }
    mov     eax, edi         # 1 uop, 0 or 1 cycle latency
    shl     eax, 10          # 1 uop, 1 cycle latency
    ret

এলইএর 2 টি উপাদান সহ সাম্প্রতিক ইন্টেল এবং এএমডি সিপিইউগুলিতে 1 চক্রের বিলম্ব এবং 2-প্রতি-ক্লক থ্রুটপুট রয়েছে। (স্যান্ডিব্রিজ-পরিবার এবং বুলডোজার / রাইজেন)। ইন্টেলে, এটি প্রতি ঘড়ি থ্রুটপুট প্রতি 3 সি ল্যাটেন্সি সহ কেবল 1 lea eax, [rdi + rsi + 123]। (সম্পর্কিত: কোলাটজ অনুমানটি পরীক্ষার জন্য আমার হাতের লিখিত সমাবেশের চেয়ে কেন এই সি ++ কোড দ্রুত? বিস্তারিতভাবে এটিতে যায়))

যাইহোক, 10 দ্বারা কপি + শিফ্টের জন্য পৃথক movনির্দেশিকা প্রয়োজন। এটি সাম্প্রতিক অনেক সিপিইউতে শূন্যের বিলম্ব হতে পারে তবে এটি এখনও ফ্রন্ট-এন্ড ব্যান্ডউইথ এবং কোড আকার নেয়। ( X86 এর এমওভি আসলেই কী "মুক্ত" হতে পারে? কেন আমি এটিকে কেন মোটেও পুনরুত্পাদন করতে পারি না? )

এছাড়াও সম্পর্কিত: x86 এ কেবলমাত্র 2 টি লল নির্দেশাবলী ব্যবহার করে 37 টি দ্বারা কীভাবে একটি নিবন্ধকে গুণ করবেন?


সংকলক আশেপাশের কোডটি রূপান্তর করতেও নিখরচায় যাতে কোনও আসল স্থানান্তর হয় না বা এটি অন্যান্য ক্রিয়াকলাপের সাথে মিলিত হয়

উদাহরণস্বরূপ উচ্চ বিট ব্যতীত সমস্ত বিট চেক if(x<<1) { }করতে একটি ব্যবহার করতে পারে and। X86-এ, আপনি কোনও testনির্দেশ ব্যবহার করবেন, তার পরিবর্তে test eax, 0x7fffffff/ এর jz .falseপরিবর্তে shl eax,1 / jz। এই অপ্টিমাইজেশনটি যে কোনও শিফ্ট গণনার জন্য কাজ করে এবং এটি এমন মেশিনেও কাজ করে যেখানে বড়-গণনার শিফটগুলি ধীর (পেন্টিয়াম 4 এর মতো), বা অস্তিত্বহীন (কিছু মাইক্রো-কন্ট্রোলার) থাকে।

অনেক আইএসএর কাছে সরিয়ে নেওয়ার বাইরে বিট-ম্যানিপুলেশন নির্দেশনা রয়েছে। উদাহরণস্বরূপ পাওয়ারপিসিতে অনেকগুলি বিট-ফিল্ড এক্সট্রাক্ট / সন্নিবেশ করার নির্দেশাবলী রয়েছে। বা এআরএমের অন্য কোনও নির্দেশের অংশ হিসাবে সোর্স অপারেশনগুলির শিফট রয়েছে। (সুতরাং শিফট / ঘোরানো নির্দেশাবলীর moveস্থানান্তরিত উত্স ব্যবহার করে কেবল একটি বিশেষ ফর্ম )

মনে রাখবেন, সি সমাবেশের ভাষা নয় । আপনি যখন দক্ষতার সাথে সংকলন করতে আপনার উত্স কোডটি টিউন করছেন তখন সর্বদা অনুকূলিত সংকলক আউটপুটটি দেখুন ।

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