স্বাক্ষরযুক্ত এবং স্বাক্ষরিত পূর্ণসংখ্যার মধ্যে পারফরম্যান্সের পার্থক্য কী? [বন্ধ]


42

আমি ফ্লোটগুলির সাথে স্বাক্ষরিত ইনটগুলি মিশ্রিত করার সময় পারফরম্যান্স হিট সম্পর্কে অবগত।

স্বাক্ষরবিহীন ints ফ্লোটের সাথে মিশ্রিত করা কি আরও খারাপ?

ভাসা ছাড়াই স্বাক্ষরিত / স্বাক্ষরযুক্ত স্বাক্ষর করার সময় কি কোনও হিট আছে?

বিভিন্ন আকারের (u32, u16, u8, i32, i16, i8) পারফরম্যান্সে কোনও প্রভাব আছে? কোন প্ল্যাটফর্মে?


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

উত্তর:


36

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

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


আপনি যে নিবন্ধটি সংযুক্ত করেছেন তাতে বলা হয়েছে যে পিএস 3 সেল প্রসেসর এটির ব্যতিক্রম কারণ স্পষ্টতই সমস্ত কিছু একই রেজিস্টারে সংরক্ষণ করা হয় (নিবন্ধের মাঝামাঝি স্থানে পাওয়া যায় বা "সেল" অনুসন্ধান করা যেতে পারে)।
বম্মজ্যাক

4
@ অ্যালবামজ্যাক: এটি কেবল এসপিইর ক্ষেত্রে প্রযোজ্য, পিপিই নয়; এসপিইগুলির একটি খুব, আহ, বিশেষ, ভাসমান পয়েন্ট পরিবেশ রয়েছে এবং theালাই এখনও তুলনামূলকভাবে ব্যয়বহুল। এছাড়াও, স্বাক্ষরিত বনাম স্বাক্ষরযুক্ত ইন্টিজারগুলির জন্য ব্যয়গুলি এখনও সমান।

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

1
@ লুইস - আমি এটি সম্পর্কে কিছু সার্বজনীন ডকুমেন্টেশন সন্ধান করার চেষ্টা করছিলাম তবে এই মুহুর্তে এটি খুঁজে পাচ্ছি না। আপনার যদি এক্সবক্স 360 ডকুমেন্টেশনে অ্যাক্সেস থাকে তবে ব্রুস ডসনের একটি ভাল হুইটপ্যাপার রয়েছে যা এর কয়েকটি (এবং এটি সাধারণভাবে খুব ভাল) coversেকে রাখে।
celion

@ লুইস: আমি নীচে একটি বিশ্লেষণ পোস্ট করেছি, তবে এটি আপনাকে সন্তুষ্ট করলে, দয়া করে সেলোনকে উত্তর দিন - তিনি যা বলেছেন তা সবই সঠিক, আমি যা করেছি তা কয়েকবার জিসিসি চালানো হয়েছে।

12

আমি সন্দেহ করি যে এক্সবক্স 360 এবং PS3 সম্পর্কিত তথ্য সর্বাধিক নিম্ন-স্তরের বিশদগুলির মতো, লাইসেন্সযুক্ত-বিকাশকারী-কেবল প্রাচীরের পিছনে থাকবে। তবে, আমরা একটি সমতুল্য x86 প্রোগ্রামটি তৈরি করতে পারি এবং একটি সাধারণ ধারণা পেতে এটি বিচ্ছিন্ন করতে পারি।

প্রথমে আসুন স্বাক্ষর না করা প্রশস্তকরণ কী খরচ হয় তা দেখুন:

unsigned char x = 1;
unsigned int y = 1;
unsigned int z;
z = x;
z = y;

সম্পর্কিত অংশটি ডিসিসেমেবল করে (জিসিসি ৪.৪.৫ ব্যবহার করে):

    z = x;
  27:   0f b6 45 ff             movzbl -0x1(%ebp),%eax
  2b:   89 45 f4                mov    %eax,-0xc(%ebp)
    z = y;
  2e:   8b 45 f8                mov    -0x8(%ebp),%eax
  31:   89 45 f4                mov    %eax,-0xc(%ebp)

সুতরাং মূলত একই - এক ক্ষেত্রে আমরা একটি বাইট সরানো, অন্য ক্ষেত্রে আমরা একটি শব্দ সরানো। পরবর্তী:

signed char x = 1;
signed int y = 1;
signed int z;
z = x;
z = y;

এতে পরিণত হয়:

   z = x;
  11:   0f be 45 ff             movsbl -0x1(%ebp),%eax
  15:   89 45 f4                mov    %eax,-0xc(%ebp)
    z = y;
  18:   8b 45 f8                mov    -0x8(%ebp),%eax
  1b:   89 45 f4                mov    %eax,-0xc(%ebp)

সুতরাং সাইন এক্সটেনশনের ব্যয়টি যা হয় movsblতার চেয়ে যত বেশি ব্যয় movzblহয় - উপ-শিক্ষার স্তর। আধুনিক প্রসেসররা যেভাবে কাজ করেন তার কারণে এটি আধুনিকভাবে প্রসেসরের পরিমাণ নির্ধারণ করা অসম্ভব। মেমরির গতি থেকে শুরু করে পাইপলাইনে যা ছিল আগে থেকে ক্যাশিং অবধি যা কিছু ছিল তা রানটাইমকে আধিপত্য করতে চলেছে।

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

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


2
(সিডব্লু কারণ এটি সত্যই সিলেওনের উত্তরের একটি মন্তব্য, এবং কারণ আমি কী আগ্রহী লোকেরা কী কোড পরিবর্তনগুলি আরও চিত্রিত করতে পারে তা জানতে আগ্রহী))

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

@ জেসন: আমি আমার পোস্টকে সিডাব্লু হিসাবে পতাকাঙ্কিত করেছি যাতে কেউ যদি এটি করে তবে তারা তথ্য সরবরাহ করতে পারে। তবে, সোনির অফিসিয়াল গেমস সংকলকটিতে অ্যাক্সেস সহ যে কেউ - যা সত্যই একমাত্র বিষয় - এটি সম্ভবত এটি করা থেকে বিরত রয়েছে।

আসলে স্বাক্ষরিত পূর্ণসংখ্যা পিপিসি আইআইআরসি-তে আরও ব্যয়বহুল। এটির একটি ছোট্ট পারফরম্যান্স হিট হয়েছে, তবে এটি সেখানে রয়েছে ... পিএস 3 পিপিইউ / এসপিইউর বিশদগুলিও এখানে রয়েছে: jheriko-rtw.blogspot.co.uk/2011/07/ps3-ppspu-docs.html এবং এখানে: jheriko-rtw.blogspot.co.uk/2011/03/ppc-in تعمیر-set.html । কৌতূহল এই গেমস সংকলকটি কি তবে? এটি কি জিসিসির সংকলক বা এসএনসি এক? অন্তর্নিহিত লুপগুলি অনুকূলকরণের বিষয়ে কথা বলার সময় ইতিমধ্যে স্বাক্ষরিত তুলনাগুলি উল্লিখিত জিনিসগুলি বাদে আইরিকের ওভারহেড থাকে। যদিও এটি বর্ণনামূলক
ডক্সে

4

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

unsigned foo(unsigned a) { return a / 1024U; }

এতে অনুকূলিত হতে চলেছে:

unsigned foo(unsigned a) { return a >> 10; }

কিন্তু ...

int foo(int a) { return a / 1024; }

এতে অনুকূলিত হবে:

int foo(int a) {
  return (a + 1023 * (a < 0)) >> 10;
}

বা এমন সিস্টেমে যেখানে শাখা প্রশস্ত করা সস্তা,

int foo(int a) {
  if (a >= 0) return a >> 10;
  else return (a + 1023) >> 10;
}

একই মডুলোর জন্য যায়। এটি অ-ক্ষমতার -2-এর ক্ষেত্রেও সত্য (তবে উদাহরণটি আরও জটিল)। যদি আপনার আর্কিটেকচারটিতে একটি হার্ডওয়্যার বিভাজন নেই (যেমন সর্বাধিক এআরএম), অ-কনসেটগুলির স্বাক্ষরযুক্ত বিভাজনগুলি আরও দ্রুত।

সাধারণভাবে, সংকলকটি বলছেন যে negativeণাত্মক সংখ্যার ফলাফল হতে পারে না অভিব্যক্তির অপ্টিমাইজেশানকে সহায়তা করবে, বিশেষত লুপ সমাপ্তি এবং অন্যান্য শর্তাবলীর জন্য ব্যবহৃত।

বিভিন্ন আকারের ints হিসাবে, হ্যাঁ একটি সামান্য প্রভাব আছে কিন্তু আপনি কম ভারী মেমরি ঘুরিয়ে তুলতে হবে। আকার বিস্তৃতি থেকে হারিয়ে যাওয়ার চেয়ে আজকাল আপনি সম্ভবত কম মেমরি অ্যাক্সেস করে বেশি লাভ করেছেন। আপনি এই মুহুর্তে মাইক্রো-অপ্টিমাইজেশনের খুব দূরে।


আমি আপনার অপ্টিমাইজড কোডটি সম্পাদিত করেছি জিসিসি আসলে কী উত্পন্ন করে তার চেয়ে বেশি প্রতিচ্ছবি হতে-ও-তেও। যখন একটি পরীক্ষা + লি এটি শাখাবিহীন করতে দেয় তখন একটি শাখা থাকা বিভ্রান্তিকর ছিল।

2
X86 এ, হতে পারে। এআরএমভি 7 এ এটি শর্তসাপেক্ষে কার্যকর করা হয়েছে।
জন রিপলে

3

স্বাক্ষরিত বা স্বাক্ষরযুক্ত স্বাক্ষরযুক্ত অপারেশনগুলির সাথে বর্তমান প্রসেসরের (x86_64, x86, পাওয়ারপিসি, আর্ম) একই মূল্য রয়েছে। 32 বিটস প্রসেসরে, u32, u16, u8 s32, s16, s8 একই হওয়া উচিত। খারাপ অ্যালিজিনমেন্টের সাথে আপনার পেনাল্টি থাকতে পারে।

তবে ইনটকে ফ্লোটে বা ফ্লোটকে ইনটে রূপান্তর করা একটি ব্যয়বহুল ক্রিয়াকলাপ। আপনি সহজেই অপ্টিমাইজড বাস্তবায়ন (এসএসই 2, নিয়ন ...) সন্ধান করতে পারেন।

সবচেয়ে গুরুত্বপূর্ণ পয়েন্টটি সম্ভবত মেমরি অ্যাক্সেস। যদি আপনার ডেটা L1 / L2 ক্যাশে ফিট না করে তবে আপনি রূপান্তরের চেয়ে আরও বেশি চক্র আলগা করবেন।


2

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

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

ডেটা প্রান্তিককরণ সম্পর্কে সতর্কতা অবলম্বন করুন। বেশিরভাগ এইচডাব্লু বাস্তবায়নে নন সাইনড লোড এবং স্টোরগুলি ধীর হয়। প্রাকৃতিক সারিবদ্ধকরণের অর্থ, 4 বাইট শব্দের জন্য, ঠিকানাটি চারটির একাধিক এবং আট বাইট শব্দের ঠিকানাগুলি আট বাইটের গুণক হওয়া উচিত। এটি এসএসইতে বহন করে (128 বিট 16 বাইট প্রান্তিককরণের পক্ষে)। এভিএক্স শীঘ্রই এই "ভেক্টর" রেজিস্টার আকারগুলিকে 256 বেট এবং তারপরে 512 বাইটে প্রসারিত করবে। এবং সারিবদ্ধ লোড / স্টোরগুলি স্বাক্ষরবিহীনদের চেয়ে দ্রুত হবে। এইচডাব্লু গিক্সের জন্য, একটি স্বাক্ষরবিহীন মেমরি অপারেশন ক্যাচলাইন এবং এমনকি পৃষ্ঠার সীমানার মতো জিনিসগুলিকে বিস্তৃত করতে পারে, যার জন্য এইচডব্লিউকে সতর্ক থাকতে হবে।


1

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

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

স্থানীয় ভেরিয়েবলের জন্য int সহ আটকে থাকুন এবং এর বেশিরভাগটি ডিফল্ট হয়ে যাবে।


0

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

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

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


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

@ জো ওয়ারেছনিগ: জঘন্য। আমি এটি সন্ধান করতে পারছি না, তবে আমি জানি যে আমি সংজ্ঞায়িত wraparound আচরণের জন্য বিভিন্ন এসেম্বলারের আউটপুট অ্যাকাউন্টিংয়ের উদাহরণ দেখেছি, কমপক্ষে নির্দিষ্ট প্ল্যাটফর্মে। আমি কেবলমাত্র সম্পর্কিত পোস্টটি দেখতে পেলাম: stackoverflow.com/questions/4712315/…
জন পুরী

বিভিন্ন মোড়কের আচরণের জন্য পৃথক এসেম্বলারের আউটপুট হ'ল কারণ সংকলক স্বাক্ষরিত ক্ষেত্রে অপ্টিমাইজেশন করতে পারে যে, উদাহরণস্বরূপ যদি বি <0 হয় তবে অ + বি> এ, কারণ স্বাক্ষরিত ওভারফ্লো অনির্ধারিত (এবং এভাবে নির্ভর করা যায় না)। এটি সত্যিই সম্পূর্ণ ভিন্ন পরিস্থিতি।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.