কেন অকেজো এমওভি নির্দেশাবলী প্রবর্তন করে x86_64 সমাবেশে একটি আঁট লুপ গতি বাড়িয়ে দেবে?


222

পটভূমি:

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

আমার অবাক করে দিয়েছি, অপ্রয়োজনীয় নির্দেশনা সরিয়ে দেওয়ার কারণে আমার প্রোগ্রামটি ধীর হয়ে গেছে

আমি দেখতে পেয়েছি যে স্বেচ্ছাসেবী, অকেজো MOVনির্দেশাবলী যোগ করার পরে আরও কার্যকারিতা বৃদ্ধি পেয়েছিল

প্রভাব লক্ষ্যভ্রষ্ট হয়, এবং মৃত্যুদন্ড অর্ডার উপর ভিত্তি করে পরিবর্তন: একই আবর্জনা নির্দেশাবলী পক্ষান্তরিত একটি একক লাইন নিচে আপ বা একটি মন্দার উত্পাদন

আমি বুঝতে পারি যে সিপিইউ সব ধরণের অপ্টিমাইজেশান এবং স্ট্রিমলাইনিং করে, তবে, এটি কালো যাদু বলে মনে হয়।

তথ্যটি:

আমার কোডের একটি সংস্করণ শর্তসাপেক্ষে লুপের মাঝখানে তিনটি জাঙ্ক অপারেশন সংকলন করে যা 2**20==1048576বার বার চলে runs (পার্শ্ববর্তী প্রোগ্রামটি কেবল SHA-256 হ্যাশ গণনা করে )।

আমার বরং পুরানো মেশিনের ফলাফল (ইন্টেল (আর) কোর (টিএম) 2 সিপিইউ 6400 @ 2.13 গিগাহার্টজ):

avg time (ms) with -dJUNKOPS: 1822.84 ms
avg time (ms) without:        1836.44 ms

প্রোগ্রামগুলি একটি লুপে 25 বার সঞ্চালিত হয়, প্রতিটি সময় রান ক্রম এলোমেলোভাবে পরিবর্তিত হয়।

উদ্ধৃতাংশ:

{$asmmode intel}
procedure example_junkop_in_sha256;
  var s1, t2 : uint32;
  begin
    // Here are parts of the SHA-256 algorithm, in Pascal:
    // s0 {r10d} := ror(a, 2) xor ror(a, 13) xor ror(a, 22)
    // s1 {r11d} := ror(e, 6) xor ror(e, 11) xor ror(e, 25)
    // Here is how I translated them (side by side to show symmetry):
  asm
    MOV r8d, a                 ; MOV r9d, e
    ROR r8d, 2                 ; ROR r9d, 6
    MOV r10d, r8d              ; MOV r11d, r9d
    ROR r8d, 11    {13 total}  ; ROR r9d, 5     {11 total}
    XOR r10d, r8d              ; XOR r11d, r9d
    ROR r8d, 9     {22 total}  ; ROR r9d, 14    {25 total}
    XOR r10d, r8d              ; XOR r11d, r9d

    // Here is the extraneous operation that I removed, causing a speedup
    // s1 is the uint32 variable declared at the start of the Pascal code.
    //
    // I had cleaned up the code, so I no longer needed this variable, and 
    // could just leave the value sitting in the r11d register until I needed
    // it again later.
    //
    // Since copying to RAM seemed like a waste, I removed the instruction, 
    // only to discover that the code ran slower without it.
    {$IFDEF JUNKOPS}
    MOV s1,  r11d
    {$ENDIF}

    // The next part of the code just moves on to another part of SHA-256,
    // maj { r12d } := (a and b) xor (a and c) xor (b and c)
    mov r8d,  a
    mov r9d,  b
    mov r13d, r9d // Set aside a copy of b
    and r9d,  r8d

    mov r12d, c
    and r8d, r12d  { a and c }
    xor r9d, r8d

    and r12d, r13d { c and b }
    xor r12d, r9d

    // Copying the calculated value to the same s1 variable is another speedup.
    // As far as I can tell, it doesn't actually matter what register is copied,
    // but moving this line up or down makes a huge difference.
    {$IFDEF JUNKOPS}
    MOV s1,  r9d // after mov r12d, c
    {$ENDIF}

    // And here is where the two calculated values above are actually used:
    // T2 {r12d} := S0 {r10d} + Maj {r12d};
    ADD r12d, r10d
    MOV T2, r12d

  end
end;

এটি নিজে চেষ্টা করো:

আপনি যদি নিজে চেষ্টা করে দেখতে চান তবে কোডটি গিটহাবে অনলাইনে রয়েছে

আমার প্রশ্নগুলো:

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

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

1
@ ব্র্যাটহেল ভাল বক্তব্য, ধন্যবাদ। আমি কিছু ভাষ্য সহ একটি কোড অংশ যোগ করেছি। নিবন্ধের মূল্যটিকে পরে ব্যবহার করা গেলেও নিবন্ধটিকে নিবন্ধভুক্ত হিসাবে চিহ্নিত করতে কোনও নিবন্ধের মানটি অনুলিপি করবেন?
স্পর্শকর্ম

9
আপনি কি সেই গড়গুলিতে মানক বিচ্যুতি রাখতে পারেন? এই পোস্টে আসল ইঙ্গিত নেই যে আসল পার্থক্য রয়েছে।
starwed

2
আপনি দয়া করে rdtscp নির্দেশ ব্যবহার করে নির্দেশাবলীর সময় চেষ্টা করতে পারেন এবং উভয় সংস্করণের জন্য ঘড়ির চক্রটি পরীক্ষা করতে পারেন?
jakobotsch

2
এটি মেমরি প্রান্তিককরণের কারণেও হতে পারে? আমি নিজেই গণিত করি নি (অলস: পি) তবে কিছু
ছদ্মবেশী

উত্তর:


144

গতির উন্নতির সর্বাধিক সম্ভাব্য কারণ হ'ল:

  • একটি এমওভি inোকানো পরবর্তী নির্দেশাবলী বিভিন্ন মেমরি ঠিকানায় স্থানান্তর করে
  • এই সরানো নির্দেশাবলীর মধ্যে একটি হ'ল একটি গুরুত্বপূর্ণ শর্তাধীন শাখা
  • শাখার পূর্বাভাস সারণিতে আলিয়াসের কারণে সেই শাখাটি ভুলভাবে পূর্বাভাস দেওয়া হয়েছিল
  • শাখাটি সরিয়ে রাখার ফলে উপনামটি মুছে ফেলা হয় এবং শাখাকে সঠিকভাবে অনুমান করা যায়

আপনার কোর 2 প্রতিটি শর্তাধীন জাম্পের জন্য পৃথক ইতিহাসের রেকর্ড রাখে না। পরিবর্তে এটি সমস্ত শর্তাধীন জাম্পের একটি ভাগ করা ইতিহাস রাখে। বৈশ্বিক শাখার পূর্বাভাসের একটি অসুবিধা হ'ল বিভিন্ন শর্তাধীন জাম্প অসম্পর্কিত থাকলে ইতিহাস অপ্রাসঙ্গিক তথ্য দ্বারা মেশানো হয়।

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

আপনি যদি শাখার ভুল ধারণাটি কার্য সম্পাদনকে কীভাবে প্রভাবিত করে তা বুঝতে চান, এই দুর্দান্ত উত্তরটি একবার দেখুন: https://stackoverflow.com/a/11227902/1001643

কোন শাখাটি উপন্যাস করবে এবং সেই উপনামগুলি তাৎপর্যপূর্ণ হবে কিনা তা জানতে সাধারণত কম্পাইলারদের পর্যাপ্ত তথ্য নেই information যাইহোক, সেই তথ্য রান-টাইমে ক্যাশেগ্রিন্ড এবং ভিটিউনের মতো সরঞ্জামগুলির সাথে নির্ধারণ করা যেতে পারে ।


2
হুম। এটি আশাব্যঞ্জক মনে হচ্ছে। এই sha256 বাস্তবায়নের একমাত্র শর্তাধীন শাখাগুলি হল ফর লুপগুলির শেষের জন্য চেক। এই সময়ে, আমি এই সংশোধনটিকে গিটের এক অদ্ভুততা হিসাবে ট্যাগ করেছিলাম এবং অপ্টিমাইজ করতে থাকি। আমার পরবর্তী পদক্ষেপগুলির একটি হ'ল নিজেকে সমাবেশে লুপ করার জন্য প্যাসকেলটি পুনরায় লেখা, যার এই অতিরিক্ত নির্দেশাবলী আর ইতিবাচক প্রভাব ফেলেনি। সম্ভবত ফ্রি পাস্কেলের উত্পন্ন কোডটি প্রসেসরের পক্ষে পূর্বাভাস দেওয়া আরও সহজ ছিল যেটা আমি এর পরিবর্তে প্রতিস্থাপন করেছি counter
স্পর্শকোষ

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

1
আমি মনে করি যে আমি যে নির্দিষ্ট আচরণটি পর্যবেক্ষণ করেছি তার এটি সবচেয়ে যুক্তিসঙ্গত ব্যাখ্যা, সুতরাং আমি এটিকে উত্তর হিসাবে চিহ্নিত করব। ধন্যবাদ। :)
স্পর্শকাতরতা

3
আছে: Bochs দৌড়ে contributers মধ্যে এর একই সমস্যা এক একটি একেবারে চমৎকার আলোচনা হয়, তাহলে আপনি আপনার উত্তর করার জন্য এই অ্যাড করতে পারেন emulators.com/docs/nx25_nostradamus.htm
লিয়েন্ডার

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

80

আপনি http://research.google.com/pubs/pub37077.html পড়তে চাইতে পারেন

টিএল; ডিআর: প্রোগ্রামগুলিতে এলোমেলোভাবে নির্দেশাবলী সন্নিবেশ করাতে পারফরম্যান্সটি 5% বা তার বেশি বাড়াতে পারে এবং না, সংকলকরা সহজেই এটি ব্যবহার করতে পারে না। এটি সাধারণত শাখার ভবিষ্যদ্বাণীকারী এবং ক্যাশে আচরণের সংমিশ্রণ, তবে এটি ঠিক যেমন একটি সংরক্ষণাগার স্টলও হতে পারে (এমনকি কোনও নির্ভরতা শৃঙ্খাগুলিও ভেঙে দেওয়া বা স্বতঃ-সাবস্ক্রিপশনের উপর সুস্পষ্ট উত্স নয়)।


1
মজাদার. তবে প্রসেসর (বা এফপিসি) দেখতে যথেষ্ট স্মার্ট যে র্যামকে লেখা এই ক্ষেত্রে এনওপি?
স্পর্শকর্ম

8
অ্যাসেমব্লার অনুকূলিত হয় না।
মার্কো ভ্যান ডি ভুর্ট

5
কম্পাইলাররা বারবার বিল্ডিং এবং প্রোফাইলিংয়ের মতো অবিশ্বাস্যরূপে ব্যয়বহুল অপটিমাইজেশন করে এবং তারপরে সিমুলেটেড অ্যানিলিং বা জেনেটিক অ্যালগরিদমের সাহায্যে কম্পাইলার আউটপুট পরিবর্তিত করে এটি কাজে লাগাতে পারে। আমি area অঞ্চলে কিছু কাজ সম্পর্কে পড়েছি। তবে আমরা কম্পাইল করতে 100% সিপিইউর সর্বনিম্ন 5-10 মিনিটের মধ্যে কথা বলছি এবং ফলস্বরূপ অপ্টিমাইজেশানগুলি সম্ভবত সিপিইউ কোর মডেল এবং এমনকি কোর বা মাইক্রোকোড সংশোধন নির্দিষ্ট হবে specific
আদমআইরিমেঙ্কো

আমি এটিকে এলোমেলো এনওপি বলব না, তারা ব্যাখ্যা করে যে কেন এনওপিগুলি পারফরম্যান্সের উপর ইতিবাচক প্রভাব ফেলতে পারে (tl; dr: stackoverflow.com/a/5901856/357198 ) এবং এনওপি এলোমেলো প্রবেশের ফলে কর্মক্ষমতা হ্রাস পেতে পারে। কাগজটির মজার বিষয়টি হ'ল জিসিসি দ্বারা 'কৌশলগত' এনওপি অপসারণের সামগ্রিক পারফরম্যান্সে কোনও প্রভাব পড়েনি!
পুয়েরকপপ

15

আমি আধুনিক সিপিইউগুলিতে বিশ্বাস করি বিধানসভা নির্দেশাবলীতে, যদিও কোনও সিপিইউতে কার্যকর করার নির্দেশাবলী দেওয়ার জন্য প্রোগ্রামারের কাছে শেষ দৃশ্যমান স্তর হ'ল, আসলে সিপিইউ দ্বারা বাস্তবায়িতকরণ থেকে বেশ কয়েকটি স্তর।

আধুনিক সিপিইউগুলি হ'ল আরআইএসসি / সিআইএসসি হাইব্রিড যা সিআইএসসি x86 নির্দেশকে অভ্যন্তরীণ নির্দেশাবলীতে অনুবাদ করে যা আচরণে আরও RISC are অতিরিক্তভাবে অর্ডার এক্সিকিউশন বিশ্লেষক, শাখার ভবিষ্যদ্বাণীকারী, ইন্টেলের "মাইক্রো-অপস ফিউশন" রয়েছে যা যুগপত কাজের বৃহত্তর ব্যাচে (যেমন ভিআইএলডাব্লু / ইটানিয়াম টাইটানিকের মতো) নির্দেশনা গোষ্ঠীবদ্ধ করার চেষ্টা করে । এমন কি ক্যাশের সীমানা রয়েছে যা কোডটি godশ্বর-জেনার জন্য দ্রুত চালাতে পারে - কেন এটি বড় হলে (সম্ভবত ক্যাশে নিয়ামক এটিকে আরও বুদ্ধিমানভাবে স্লট করেন, বা আরও দীর্ঘকাল ধরে রাখবেন)।

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

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


6
আপনার উত্তরটি বিভ্রান্তিকর। অনেক জায়গায় দেখে মনে হচ্ছে আপনি অনুমান করছেন, যদিও আপনি যা বলেন তার বেশিরভাগই সঠিক।
alcuadrado

2
সম্ভবত আমার স্পষ্ট করা উচিত। যা আমি বিভ্রান্তিকর মনে করি তা
হ'ল

3
অনুমান করা যা বোঝায় এবং ভাল যুক্তি দিয়ে সম্পূর্ণ বৈধ।
jturolla

7
ওপি কেন এই অদ্ভুত আচরণটি পর্যবেক্ষণ করছে তা নিশ্চিতভাবে কেউ জানতে পারে না, যদি না এটি ইন্টেলের কোনও প্রকৌশলী না ছিল যার বিশেষ ডায়াগনস্টিক সরঞ্জামগুলির অ্যাক্সেস ছিল। সুতরাং অন্য সবগুলি অনুমান করা যায়। এটি @ কাপয়ার্ড্লাইড্রাগন এর দোষ নয়।
অ্যালেক্স ডি

2
Downvote; আপনি যা বলেন তার কোনওটিই ওপি যে আচরণটি দেখছে তার ব্যাখ্যা দেয় না। আপনার উত্তরটি অকেজো।
ফুজ

0

ক্যাশে প্রস্তুত করা হচ্ছে

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

মিথ্যা নির্ভরতা ভঙ্গ করা

যদিও এটি আপনার কেসটি হুবহু উল্লেখ করে না, তবে কখনও কখনও -৪-বিট প্রসেসরের অধীনে (যেমন আপনার ক্ষেত্রে) 32-বিট মুভ অপারেশন ব্যবহার করে উচ্চ বিটগুলি সাফ করতে ব্যবহৃত হয় (32-63) এবং নির্ভরতা শৃঙ্খলাগুলি ভেঙে দেয়।

এটি সর্বজনবিদিত যে x86-64 এর অধীনে, 32-বিট অপারেন্ডগুলি ব্যবহার করে 64৪-বিট নিবন্ধকের উচ্চতর বিট সাফ করে। প্লিজ প্রাসঙ্গিক বিভাগটি পড়ুন - 3.4.1.1 - ইন্টেল ®৪ এবং আইএ -32 আর্কিটেকচার সফটওয়্যার বিকাশকারীর ম্যানুয়াল ভলিউম 1 :

32-বিট অপারেশনগুলি 32-বিট ফলাফল উত্পন্ন করে, শূন্য-প্রসারিত একটি 64-বিট ফলাফলের গন্তব্য সাধারণ-উদ্দেশ্য রেজিস্ট্রারে

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

ইন্টেল ®৪ এবং আইএ -32 আর্কিটেকচার অপটিমাইজেশন রেফারেন্স ম্যানুয়াল , বিভাগ 3.5.3.8 থেকে একটি উদ্ধৃতি :

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

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

এক্স 64 এর 32-বিট অপারেটর সহ মুভজএক্স এবং এমওভি সমান - তারা সকলেই নির্ভরতা শৃঙ্খলাগুলি ভেঙে দেয়।

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

রেজিস্টার নামকরণ একটি সিপিইউ দ্বারা অভ্যন্তরীণভাবে ব্যবহৃত কৌশল যা তাদের মধ্যে সত্যিকারের ডেটা নির্ভরতা না থাকা ধারাবাহিক নির্দেশাবলীর দ্বারা নিবন্ধগুলির পুনরায় ব্যবহার থেকে উদ্ভূত মিথ্যা ডেটা নির্ভরতা দূর করে।

আমি মনে করি আপনি এখন দেখতে পাচ্ছেন যে এটি খুব সুস্পষ্ট।


এটি সমস্ত সত্য, তবে প্রশ্নটিতে উপস্থাপিত কোডের সাথে কোনও সম্পর্ক নেই।
কোডি গ্রে

@ কোডি গ্রে - আপনার মতামতের জন্য আপনাকে ধন্যবাদ। আমি উত্তরটি সম্পাদনা করেছি এবং কেস সম্পর্কে একটি অধ্যায় যুক্ত করেছি - রেজিস্টার অপারেশন দ্বারা ঘেরা স্মৃতিতে ক্যাশে প্রস্তুত হয় এবং স্টোর ইউনিট যেভাবেই নিষ্ক্রিয় থাকে তাই এটি বিনামূল্যে। সুতরাং পরবর্তী স্টোর অপারেশন দ্রুত হবে।
ম্যাক্সিম ম্যাসিউটিন

1
৩২-বিট অপারেটসের জন্য কোনও মোভজএক্সএক্স নেই, কারণ instructions২-বিট গন্তব্য সহ সমস্ত নির্দেশাবলী পূর্ণ
-৪
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.