আমি যখন সিতে স্থানান্তর এবং গুণনের মধ্যে সময়ের পার্থক্যটি পরীক্ষা করি তখন কোনও পার্থক্য নেই। কেন?


28

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

#include <time.h>
#include <stdio.h>

int main() {
    clock_t launch = clock();
    int test = 0x01;
    int runs;

    //simple loop that oscillates between int 1 and int 2
    for (runs = 0; runs < 100000000; runs++) {


    // I first compiled + ran it a few times with this:
    test *= 2;

    // then I recompiled + ran it a few times with:
    test <<= 1;

    // set back to 1 each time
    test >>= 1;
    }

    clock_t done = clock();
    double diff = (done - launch);
    printf("%f\n",diff);
}

উভয় সংস্করণের জন্য, মুদ্রণটি প্রায় 440000 ছিল, 10000 দিন বা নিন। দুটি সংস্করণের আউটপুটগুলির মধ্যে কোনও (দৃশ্যত, কমপক্ষে) উল্লেখযোগ্য পার্থক্য ছিল না। সুতরাং আমার প্রশ্নটি হল, আমার পদ্ধতিটিতে কিছু ভুল আছে? এমনকি একটি চাক্ষুষ পার্থক্য থাকা উচিত? এটির কি আমার কম্পিউটারের আর্কিটেকচার, সংকলক বা অন্য কিছুর সাথে কিছু করার আছে?


47
যিনি আপনাকে শিখিয়েছিলেন তা স্পষ্টভাবে ভুল হয়ে গেছে। সেই বিশ্বাসটি সাধারণভাবে ব্যবহৃত আর্কিটেকচারে সাধারণত ব্যবহৃত সংকলকগুলির জন্য, 1970 এর দশক থেকে সত্য হয়নি। এই দাবিটি পরীক্ষার জন্য আপনার পক্ষে ভাল Good আমি স্বর্গের জন্য জাভাস্ক্রিপ্ট সম্পর্কে করা এই অযৌক্তিক দাবিটি শুনেছি ।
এরিক লিপার্ট

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

8
একটি উল্লেখ করা উচিত যে এটিকে দেখার পরে gcc -S, কোডটি test *= 2আসলে সংকলিত হয় shll $1, %eax যখন অনুরোধ করা হয় gcc -O3 -Sএমনকি একটি লুপও নেই। দুটি ঘড়ি কলগুলি আলাদা আলাদা লাইন:callq _clock movq %rax, %rbx callq _clock

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

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

উত্তর:


44

অন্য উত্তরে যেমন বলা হয়েছে, বেশিরভাগ সংকলক বিট শিফ্টের সাথে সম্পন্ন করতে গুণাগুণকে স্বয়ংক্রিয়ভাবে অনুকূল করবে।

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

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

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


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

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

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

2
@ নিকোলাসফোক: এই স্তরের অপ্টিমাইজেশানগুলি যাইহোক যাইহোক সিপিইউ আর্কিটেকচার দ্বারা প্রায় অস্পষ্ট বা রেন্ডার মিট হয় m সবেমাত্র স্মৃতি থেকে আর্গুমেন্টগুলি এনে এবং সেগুলি আবার লেখার জন্য 100 টির বেশি সময় লাগে যখন আপনি 50 টি চক্র সংরক্ষণ করেন তবে কে কে পাত্তা দেয়? মেমোরিটি সিপিইউর গতিতে (বা তার কাছাকাছি) চলার পরে এই জাতীয় মাইক্রো-অপ্টিমাইজেশানগুলি বোধগম্য হয়েছিল, তবে আজ এতটা নয়।
টিএমএন

2
কারণ আমি এই উক্তিটির 10% দেখে ক্লান্ত হয়ে পড়েছি এবং কারণ এটি এখানে মাথার পেরেকটি আঘাত করে: "এতে কোনও সন্দেহ নেই যে দক্ষতার কড়াকড়ি অপব্যবহারের দিকে পরিচালিত করে Program প্রোগ্রামাররা প্রচুর পরিমাণে সময় নিয়ে চিন্তাভাবনা করে, বা উদ্বেগ করে সম্পর্কে, তাদের প্রোগ্রামের অদ্বিতীয় অংশগুলির গতি এবং ডিবাগিং এবং রক্ষণাবেক্ষণ বিবেচনা করার সময় দক্ষতার এই প্রচেষ্টাগুলি একটি দৃ negative় নেতিবাচক প্রভাব ফেলে থাকে small 97% সময় সম্পর্কে আমাদের বলা উচিত: ছোট কার্যকারিতা সম্পর্কে আমাদের ভুলে যাওয়া উচিত : অকাল অপ্টিমাইজেশনের মূল সমস্ত মন্দ। ...
সিএও

25

সংকলকটি ধ্রুবককে স্বীকৃতি দেয় এবং গুণিতগুলি যেখানে উপযুক্ত হয় সেখানে স্থানান্তরিত করে।


সংকলকটি ধ্রুবকগুলিকে স্বীকৃতি দেয় যা 2 এর শক্তি .... এবং শিফটে রূপান্তর করে। সমস্ত ধ্রুবককে শিফটে পরিবর্তন করা যায় না।
দ্রুত

4
@ কুইক্লি_নউ: এগুলিকে শিফট এবং সংযোজন / বিয়োগের সংমিশ্রণে রূপান্তর করা যেতে পারে।
মেহেরদাদ

2
একটি ক্লাসিক সংকলক অপ্টিমাইজার বাগটি ভাগকে ডান শিফটে রূপান্তর করতে হয় যা ইতিবাচক লভ্যাংশের জন্য কাজ করে তবে নেতিবাচক হিসাবে 1 দ্বারা বন্ধ রয়েছে।
ddyer

1
@ চটজলদি_ আমি এই শব্দটিকে বিশ্বাস করি যেখানে 'উপযুক্ত' এই ধারণাটি অন্তর্ভুক্ত করে যে কিছু ধ্রুবককে শিফট হিসাবে পুনরায় লেখা যায় না।
ফারাপ

21

গুণের চেয়ে শিফট করা আপনার সিপিইউয়ের আর্কিটেকচারের উপর নির্ভর করে Whether পেন্টিয়ামের আগের দিনগুলি এবং তার আগের দিনগুলিতে, আপনার গুণিতকটিতে 1 বিটের সংখ্যার উপর নির্ভর করে স্থানান্তরটি প্রায়শই গুনের চেয়ে দ্রুত ছিল। উদাহরণস্বরূপ, যদি আপনার গুণটি 320 হয়, এটি 101000000, দুটি বিট।

a *= 320;               // Slower
a = (a<<7) + (a<<9);    // Faster

তবে আপনার যদি আরও দুটি বিট থাকে ...

a *= 324;                        // About same speed
a = (a<<2) + (a<<7) + (a<<9);    // About same speed

a *= 340;                                 // Faster
a = (a<<2) + (a<<4) + (a<<7) + (a<<9);    // Slower

একক চক্রের গুণিতক দিয়ে একটি পিআইসি 18 এর মতো সামান্য মাইক্রোকন্ট্রোলারের উপরে , তবে কোনও ব্যারেল শিফটার নয় , আপনি যদি 1 বিটের বেশি স্থান পরিবর্তন করছেন তবে গুণটি আরও দ্রুত হয়।

a  *= 2;   // Exactly the same speed
a <<= 1;   // Exactly the same speed

a  *= 4;   // Faster
a <<= 2;   // Slower

মনে রাখবেন যে এটি পুরানো ইন্টেল সিপিইউতে যা সত্য ছিল তার বিপরীত

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

a  *= 4;   // 
b  *= 4;   // 

a <<= 2;   // Both lines execute in a single cycle
b <<= 2;   // 

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

11

আপনার পরীক্ষা প্রোগ্রামে আপনার বেশ কয়েকটি সমস্যা হয়েছে।

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

দ্বিতীয়ত, আপনি দুটি অপারেশন করেন যা একে অপরকে বাতিল করে দেয়। অপ্টিমাইজারটি এটি এবং লক্ষ্য করার অনুমতিপ্রাপ্ত সেগুলি বাতিল । আবার একটি খালি লুপ রেখে, এবং সরানো। এই এক ঠিক করা নিখুঁত কঠিন। আপনি একটি সুইচ করতে পারেন unsigned int(তাই ওভারফ্লো অনির্ধারিত আচরণ নয়), কিন্তু যে অবশ্যই ঠিক 0. আর সহজ জিনিস (বলুন, মত, ফলাফল test += 1) সহজ যথেষ্ট অপটিমাইজার জিনিসটা জন্য, আর এটা আছে।

অবশেষে, আপনি ধরে নিবেন যে test *= 2আসলে একটি গুণে সংকলিত হতে চলেছে। এটি একটি খুব সাধারণ অপ্টিমাইজেশন; যদি বিটশিফ্টটি দ্রুত হয় তবে এর পরিবর্তে অপ্টিমাইজারটি এটি ব্যবহার করবে। এটি পেতে, আপনাকে বাস্তবায়ন-নির্দিষ্ট সমাবেশ ইনলাইনের মতো কিছু ব্যবহার করতে হবে।

বা, আমি মনে করি, কোনটি দ্রুত তা দেখার জন্য আপনার মাইক্রোপ্রসেসরের ডেটা শীটটি পরীক্ষা করুন।

আমি যখন আপনার প্রোগ্রামটি gcc -S -O34.9 সংস্করণ ব্যবহার করে সংকলনের সমাবেশের আউটপুটটি চেক করেছি , তখন অপ্টিমাইজারটি উপরের প্রতিটি সাধারণ প্রকরণটি এবং আরও বেশ কয়েকটি দেখতে পেয়েছিল। সমস্ত ক্ষেত্রে, এটি লুপটি সরিয়ে ফেলল (একটি ধ্রুবককে নির্ধারণ করে test), কেবলমাত্র কলগুলি ছিল clock(), রূপান্তর / বিয়োগ কর এবং printf


1
এটিও নোট করুন যে অপ্টিমাইজারটি স্ক্যান্ট সি # বনাম স্কয়ার্ট সি ++ তে দেখানো হিসাবে ধ্রুবকগুলিতে (এমনকি একটি লুপেও) অপারেশনগুলি অপ্টিমাইজ করতে পারে যেখানে অপ্টিমাইজার আসল অঙ্কের সাথে একটি মানের যোগফলকে একটি লুপ প্রতিস্থাপন করতে সক্ষম হয়েছিল। সেই অপ্টিমাইজেশানকে পরাস্ত করতে আপনাকে রানটাইমের সময় নির্ধারিত কিছু ব্যবহার করতে হবে (যেমন একটি কমান্ড লাইন আর্গুমেন্ট)।

@ মিশেল ইয়েপ এটাই আমি বোঝাতে চেয়েছিলাম "নোট করুন যে যথেষ্ট পরিমাণে নির্ধারিত অপ্টিমাইজারটি এখনও লুপটি অপ্টিমাইজ করতে পারে (এটি সম্পূর্ণরূপে সংকলনের সময় পরিচিত ধ্রুবকগুলির উপর নির্ভর করে)"।
ডারোবার্ট

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

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

8

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

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

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

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

এই কারণগুলি হ'ল এইরকম অপ্টিমাইজেশনের হ্রাসযোগ্য পাঠযোগ্যতা এবং নিরর্থকতার সংমিশ্রণ, কারণ আপনি ইতিমধ্যে তাদের আপেক্ষিক পারফরম্যান্সের তুলনা করে খুঁজে পেয়েছেন। তবে, আমি মনে করি না যে লোকেরা যদি এই গুণাবলীর পরিবর্তনের একমাত্র উদাহরণ যেমন অপটিমাইজেশনের উদাহরণ হত তবে লোকেরা তার প্রতিক্রিয়ার মতো তীব্র প্রতিক্রিয়া প্রকাশ করবে। আপনার মত প্রশ্নগুলি প্রায়শই বিভিন্ন আকারে এবং বিভিন্ন প্রসঙ্গে আসে। আমি মনে করি যে আরও সিনিয়র ইঞ্জিনিয়াররা আসলে এত দৃ strongly়তার সাথে কী প্রতিক্রিয়া দেখায়, কমপক্ষে আমার মাঝে মাঝে ছিল তা হ'ল লোকেরা কোড বেস জুড়ে এই ধরনের মাইক্রো-অপ্টিমাইজেশানকে উদারভাবে নিযুক্ত করলে ক্ষতির আরও বিস্তৃত ক্ষতির সম্ভাবনা রয়েছে। যদি আপনি মাইক্রোসফ্টের মতো কোনও সংস্থায় একটি বৃহত কোড বেসে কাজ করেন তবে আপনি অন্যান্য ইঞ্জিনিয়ারদের সোর্স কোড পড়তে বা এতে নির্দিষ্ট কোড সনাক্ত করার চেষ্টা করতে অনেক সময় ব্যয় করবেন। এটি এমনকি আপনার নিজের কোডও হতে পারে যা আপনি কয়েক বছরের সময়কে বোঝার চেষ্টা করবেন, বিশেষত অতিমাত্রায় কিছু সময় ব্যয় করা, যেমন যখন পেজারে থাকার পরে আপনি যখন কল পেয়েছিলেন তখন আপনাকে কোনও প্রোডাক্ট আউটেজ ঠিক করতে হবে when শুক্রবার রাতে ডিউটি, বন্ধুদের সাথে এক মজার রাতে বেরিয়ে যাবার জন্য ... আপনি কোডটি পড়ার জন্য যদি এতটা সময় ব্যয় করেন তবে আপনি এটি যথাসম্ভব পঠনযোগ্য হওয়ার প্রশংসা করবেন। আপনার প্রিয় উপন্যাসটি পড়ার কল্পনা করুন, তবে প্রকাশক তারা নতুন সংস্করণ প্রকাশের সিদ্ধান্ত নিয়েছে যেখানে তারা abbrv ব্যবহার করে। সমস্ত ডিম্বপ্রাণ পিএলসি বিসিএস আপনার থানক এটি এসসিএস। এটি অন্য ইঞ্জিনিয়ারদের আপনার কোডের প্রতিক্রিয়াগুলির অনুরূপ, যদি আপনি তাদের এই জাতীয় অনুকূলিতকরণগুলি ছড়িয়ে দেন। অন্যান্য উত্তরগুলি যেমন নির্দেশ করেছে, আপনি কী বোঝাতে চেয়েছেন তা পরিষ্কার করে বলা ভাল,

এমনকি সেই পরিবেশগুলিতে, যদিও আপনি নিজেকে একটি সাক্ষাত্কারের প্রশ্নটি সমাধান করতে পারেন যেখানে আপনি এই বা অন্য কোনও সমতাটি জানেন are এগুলি জানা খারাপ নয় এবং একজন ভাল ইঞ্জিনিয়ার বাইনারি স্থানান্তরিতের পাটিগণিতের প্রভাব সম্পর্কে সচেতন হন। মনে রাখবেন যে আমি এটি বলিনি যে এটি একটি ভাল প্রকৌশলী তৈরি করে, তবে একজন ভাল প্রকৌশলী আমার মতামত জানতে পারে। বিশেষত, আপনি এখনও এমন কোনও ম্যানেজার পেতে পারেন, সাধারণত আপনার সাক্ষাত্কারের লুপের শেষ দিকে, যিনি আপনাকে কোনও কোডিং প্রশ্নে এই স্মার্ট ইঞ্জিনিয়ারিং "কৌশল" প্রকাশের জন্য আনন্দের প্রত্যাশায় বিস্তৃতভাবে আপনার দিকে ঝুঁকবেন এবং প্রমাণ করবেন যে সে / সে এছাড়াও, একজন সচেতন প্রকৌশলী হিসাবে থাকতেন বা হতেন এবং একজন "পরিচালক" নন। এই পরিস্থিতিতে, কেবল মুগ্ধ হওয়ার চেষ্টা করুন এবং আলোকিত সাক্ষাত্কারের জন্য তাকে ধন্যবাদ জানাই।

কেন আপনি সি তে গতির পার্থক্য দেখেন নি? সম্ভবত উত্তরটি হ'ল এটি উভয়ই একই সমাবেশ কোডের ফলস্বরূপ:

int shift(int i) { return i << 2; }
int multiply(int i) { return i * 2; }

উভয় মধ্যে সংকলন করতে পারেন

shift(int):
    lea eax, [0+rdi*4]
    ret

জিসিসিতে অপ্টিমাইজেশন ছাড়াই, অর্থাত্ "-O0" পতাকাটি ব্যবহার করে আপনি এটি পেতে পারেন:

shift(int):
    push    rbp
    mov rbp, rsp
    mov DWORD PTR [rbp-4], edi
    mov eax, DWORD PTR [rbp-4]
    sal eax, 2
    pop rbp
    ret
multiply(int):
    push    rbp
    mov rbp, rsp
    mov DWORD PTR [rbp-4], edi
    mov eax, DWORD PTR [rbp-4]
    add eax, eax
    pop rbp
    ret

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

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

আপনি যদি সংকলকের সেই কয়েকটি স্মার্টকে পরাভূত করতে চেয়েছিলেন তবে আপনি আরও সাধারণ শিফট এবং গুণক পদ্ধতিটি সংজ্ঞায়িত করতে পারেন এবং এরকম কিছু দিয়ে শেষ করবেন:

int shift(int i, int j) { return i << j; }
int multiply(int i, int j) { return i * j; }

যা নিম্নলিখিত সমাবেশ কোড উত্পন্ন করতে পারে:

shift(int, int):
    mov eax, edi
    mov ecx, esi
    sal eax, cl
    ret
multiply(int, int):
    mov eax, edi
    imul    eax, esi
    ret

এখানে অবশেষে আমরা পেয়েছি, এমনকি জিসিসি ৪.৯-এর সর্বোচ্চ অপ্টিমাইজেশন স্তরেও, আপনি যখন প্রাথমিকভাবে আপনার পরীক্ষাটি শুরু করেছিলেন তখন সমাবেশ নির্দেশাবলীতে আপনি যে ধারণাটি প্রত্যাশা করেছিলেন তা প্রকাশ পেতে পারে। আমি মনে করি যে নিজেই পারফরম্যান্স অপটিমাইজেশনের একটি গুরুত্বপূর্ণ পাঠ হতে পারে। আমাদের কোডটিতে কংক্রিটের ধ্রুবকগুলির জন্য পরিবর্তকের পরিবর্তনে এটি তৈরি করা পার্থক্যটি আমরা দেখতে পাই, সংকলক প্রয়োগ করতে সক্ষম স্মার্টগুলির ক্ষেত্রে। শিফ্ট-মাল্টিপল প্রতিস্থাপনের মতো মাইক্রো-অপ্টিমাইজেশানগুলি হ'ল কিছু নিম্ন-স্তরের অপ্টিমাইজেশন যা সাধারণত কোনও সংকলক সহজেই নিজের দ্বারা করতে পারে do অন্যান্য অপ্টিমাইজেশানগুলি যা কার্য সম্পাদনে আরও বেশি প্রভাবিত হয় সেগুলির একটি বোঝার প্রয়োজন কোডের উদ্দেশ্য সম্পর্কেএটি প্রায়শই সংকলক দ্বারা অ্যাক্সেসযোগ্য হয় না বা কেবল কিছু হিউরিস্টিক দ্বারা অনুমান করা যায়। আপনি এখানে সফ্টওয়্যার ইঞ্জিনিয়ার হিসাবে এসেছেন এবং এটি অবশ্যই সাধারণত শিফ্টের সাথে গুণকে প্রতিস্থাপন করে না। এটিতে এমন কোনও পরিষেবাদির জন্য অনর্থক কল এড়ানো যেমন I / O উত্পাদন করে এবং কোনও প্রক্রিয়া অবরুদ্ধ করতে পারে তার সাথে জড়িত। আপনি যদি আপনার হার্ডডিস্কে বা godশ্বর নিষেধ করেন তবে কিছু অতিরিক্ত ডেটার জন্য রিমোট ডাটাবেসে আপনি ইতিমধ্যে স্মৃতিতে যা পেয়েছেন তা থেকে উত্পন্ন হতে পারে, আপনি অপেক্ষা করার সময়টি মিলিয়ন নির্দেশাবলীর কার্যকারিতা ছাড়িয়ে যায় we এখন, আমি মনে করি আমরা আপনার মূল প্রশ্ন থেকে কিছুটা দূরে সরে এসেছি, তবে আমি মনে করি এটি একটি প্রশ্নকারীর দিকে ইঙ্গিত করা হয়েছে, বিশেষত যদি আমরা মনে করি যে কেউ সবেই কোডটির অনুবাদ এবং সম্পাদনের বিষয়ে উপলব্ধি অর্জন করতে শুরু করেছে,

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

তাহলে শিফটটি যদি গুণণের চেয়ে দ্রুত হয়? কেন এটি সত্য হবে ইঙ্গিত অবশ্যই আছে। জিসিসি, যেমন আপনি উপরে দেখতে পারেন, মনে হয় (এমনকি অপ্টিমাইজেশন ছাড়াই) মনে হয় যে অন্যান্য নির্দেশাবলীর পক্ষে সরাসরি গুণকে এড়ানো একটি ভাল ধারণা। ইন্টেল 64 এবং IA-32 আর্কিটেকচারের অপ্টিমাইজেশান রেফারেন্স ম্যানুয়াল আপনি CPU- র নির্দেশাবলী আপেক্ষিক খরচ একটি ধারণা দিতে হবে। আর একটি সংস্থান, নির্দেশের ল্যাটেন্সি এবং থ্রুপুট সম্পর্কে আরও বেশি কেন্দ্রীভূত হ'ল http://www.agner.org/optimize/in تعمیر_tables.pdf। মনে রাখবেন যে তারা নিখুঁত রানটাইমের পূর্বাভাসকারী নয়, তবে একে অপরের সাথে সম্পর্কিত নির্দেশাবলীর কার্যকারিতা। কড়া লুপে, যেমন আপনার পরীক্ষাটি অনুকরণ করছে, "থ্রুপুট" এর মেট্রিকটি সবচেয়ে প্রাসঙ্গিক হওয়া উচিত। প্রদত্ত নির্দেশনা কার্যকর করার সময় এটি একটি চক্রের সংখ্যা যা সাধারণত একটি কার্যকরকরণ ইউনিট বেঁধে দেওয়া হয়।

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

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

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

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


6

আপনি যা দেখছেন তা অপটিমাইজারের প্রভাব।

অপটিমাইজার্স কাজটি হ'ল ফলিত সংকলিত কোডটি ছোট বা দ্রুততর করা (তবে দু'জনেই একই সাথে ... তবে অনেকগুলি জিনিস পছন্দ করে ... কোডটি কী তা অবলম্বন করে)।

PRINCIPLE এ, কোনও গুণাগুলির লাইব্রেরিতে যে কোনও কল আসে বা প্রায়শই একটি হার্ডওয়্যার গুণকটি কেবল সামান্য কিছুটা শিফ্ট করার চেয়ে ধীর হয়।

সুতরাং ... যদি নিষ্পাপ সংকলকটি অপারেশন * 2 এর জন্য একটি লাইব্রেরিতে কল উত্পন্ন করে, তবে অবশ্যই এটি বিটওয়াস শিফট * এর চেয়ে ধীর হয়ে চলবে run

তবে অপ্টিমাইজাররা নিদর্শনগুলি সনাক্ত করতে এবং কোডটি কীভাবে ছোট / দ্রুত / কীভাবে তৈরি করবেন তা নির্ধারণের জন্য রয়েছে। এবং আপনি যা দেখেছেন তা হল সংকলকটি সনাক্ত করছে যে * 2 একটি শিফটের মতোই।

আগ্রহের বিষয় হিসাবে আমি ঠিক আজ 5 * এর মতো কিছু ক্রিয়াকলাপের জন্য উত্পন্ন এসেমব্লারারের দিকে চেয়ে ছিলাম ... আসলে এটি নয় তবে অন্যান্য জিনিসগুলির দিকে তাকিয়েছিলাম এবং সেই পথে আমি লক্ষ্য করেছি যে সংকলকটি * 5 তে রূপান্তরিত হয়েছে:

  • পরিবর্তন
  • পরিবর্তন
  • আসল নম্বর যুক্ত করুন

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

সংকলক অপটিমাইজারগুলির শিল্পটি সম্পূর্ণ পৃথক বিষয়, যাদুতে ভরা এবং পুরো গ্রহের প্রায় 6 জন লোক সত্যই বুঝতে পেরেছেন :)


3

এটির সাথে সময় দেওয়ার চেষ্টা করুন:

for (runs = 0; runs < 100000000; runs++) {
      ;
}

সংকলকটি বুঝতে হবে যে testলুপটির প্রতিটি পুনরাবৃত্তির পরে এর মানটি অপরিবর্তিত রয়েছে এবং এর চূড়ান্ত মানটি testঅব্যবহৃত এবং লুপটি সম্পূর্ণরূপে অপসারণ করা উচিত।


2

গুণগুলি শিফট এবং সংযোজনগুলির সংমিশ্রণ।

আপনি যে ক্ষেত্রে উল্লেখ করেছেন, আমি সংস্থাগুলি এটি সর্বোত্তম করে তোলে বা না তা বিবেচ্য নয় - " xদুটি দ্বারা গুণিত " হয় হিসাবে প্রয়োগ করা যেতে পারে:

  • xএক স্থানের বিটগুলি বামে স্থানান্তর করুন ।
  • যোগ xকরুন x

এগুলি প্রতিটি মৌলিক পারমাণবিক অপারেশন; একটি অন্যজনের চেয়ে দ্রুত নয়।

এটিকে " xচার দ্বারা গুণিত করুন ", (বা যে কোনও 2^k, k>1) এ পরিবর্তন করুন এবং এটি কিছুটা আলাদা:

  • xবাম দিকে দুটি স্থানের বিট স্থানান্তর করুন ।
  • যোগ xকরুন xএবং এটি কল করুন y, যোগ yকরুন y

একটি প্রাথমিক আর্কিটেকচারে, এটি দেখতে সহজ যে শিফটটি আরও দক্ষ - একটি বনাম দুটি ক্রিয়াকলাপ গ্রহণ করা, যেহেতু আমরা কী তা জানি না হওয়া পর্যন্ত আমরা যুক্ত yকরতে yপারি না y

2^k, k>1বাস্তবায়নের ক্ষেত্রে একই জিনিস হওয়ার জন্য তাদের অনুকূলকরণ থেকে বিরত রাখতে যথাযথ বিকল্পগুলির সাথে আধুনিক (বা কোনও ) চেষ্টা করুন । O(1)আপনার বার বার সংযোজনের তুলনায় শিফটটি দ্রুততর হওয়া উচিত O(k)

স্পষ্টতই, যেখানে গুণক দুটিটির শক্তি নয়, সেখানে শিফট এবং সংযোজনগুলির সংমিশ্রণ (প্রতিটি যেখানে একটি সংখ্যা শূন্য নয়) প্রয়োজনীয়।


1
একটি "বেসিক পরমাণু অপারেশন" কি? একটি তর্ক করতে পারেন না যে একটি শিফটে, অপারেশনটি প্রতিটি বিটকে সমান্তরালভাবে প্রয়োগ করা যেতে পারে, এ ছাড়াও বামদিকের বিটগুলি অন্যান্য বিটের উপর নির্ভর করে?
বার্গি

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

হ্যাঁ, এটি হতে পারে তবে গুণগুলিও একটি একক মেশিনের নির্দেশনা (যদিও এটি আরও চক্রের প্রয়োজন হতে পারে)
বার্গি

@ বেরগি, এটিও খিলান নির্ভর। 32-বিট সংযোজন (বা প্রযোজ্য হিসাবে এক্স-বিট) এর চেয়ে কম চক্রের আপনি কী আর্চটির কথা ভাবছেন?
ওজেফোর্ড 22'14

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

1

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

তবে এটি লক্ষ করা উচিত যে সম্ভাব্য-নেতিবাচক স্বাক্ষরিত মানগুলির বিভাজন ডান স্থানান্তর করার সমতুল্য নয় । মত একটি এক্সপ্রেশন (x+8)>>4সমতুল্য নয় (x+8)/16। প্রাক্তন, 99% সংকলকগুলিতে, -24 থেকে -9 থেকে -1, -8 থেকে +7 থেকে 0 এবং +8 থেকে +23 থেকে 1 পর্যন্ত মান প্রায় মানচিত্র তৈরি করবে [প্রায় শূন্যের প্রায় প্রতিসাম্যিক সংখ্যা]। পরবর্তীকালে -39 থেকে -24 থেকে -1, -23 থেকে +7 থেকে 0, এবং +8 থেকে +23 থেকে +1 পর্যন্ত মানচিত্র হবে [গুরুতর অসম্পূর্ণ, এবং সম্ভবত যা উদ্দেশ্য ছিল তা নয়]। মনে রাখবেন যে মানগুলি negativeণাত্মক হওয়ার আশঙ্কা করা না হলেও, সংকলক মানগুলি negativeণাত্মক হতে পারে না প্রমাণ না করা ব্যবহারের >>4ফলে দ্রুত কোড পাওয়া /16যাবে।


0

আমি আরও কিছু পরীক্ষা করে দেখেছি just

X86_64 এ, মুল অপকডটিতে 10 চক্রের বিলম্ব এবং 1/2 চক্র থ্রুপুট রয়েছে। এমওভি, এডিডি এবং এসএইচএল এর 2.5 টি, 2.5, এবং 1.7 চক্রের মাধ্যমে আউটপুট সহ 1 টি চক্রের বিলম্ব রয়েছে।

15 দ্বারা গুণিত করতে 3 এসএইচএল এবং 3 এমডি অপস কমপক্ষে এবং সম্ভবত বেশ কয়েকটি এমওভি দরকার হবে।

https://gmplib.org/~tege/x86-timing.pdf


0

আপনার পদ্ধতি ত্রুটিযুক্ত। আপনার লুপ ইনক্রিমেন্ট এবং শর্ত পরীক্ষা করা নিজেই অনেক বেশি সময় নিচ্ছে।

  • একটি খালি লুপ চালানোর চেষ্টা করুন এবং সময়টি পরিমাপ করুন (কল করুন base)।
  • এবার ১ শিফট অপারেশন যুক্ত করুন এবং সময়টি পরিমাপ করুন (এটি কল করুন s1)।
  • এরপরে 10 শিফট অপারেশন যুক্ত করুন এবং সময়টি পরিমাপ করুন (কল করুন s2)

যদি সবকিছু ঠিকঠাক হয় তবে base-s2তার চেয়ে 10 গুণ বেশি হওয়া উচিত base-s1। নাহলে অন্য কিছু এখানে আসবে।

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

int main(){

    int test = 2;
    clock_t launch = clock();

    test << 6;
    test << 6;
    test << 6;
    test << 6;
    //.... 1 million times
    test << 6;

    clock_t done = clock();
    printf("Time taken : %d\n", done - launch);
    return 0;
}

এবং সেখানে আপনি আপনার ফলাফল আছে

1 মিলিসেকেন্ডের নিচে 1 মিলিয়ন শিফট অপারেশন?

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

শিফটওয়াইজ অপারেটর ফলাফল

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