স্বাক্ষরিত বাইটগুলির জন্য স্যাচুরেটিং বিয়োগ / যোগ করুন


83

ভাবুন আমার দুটি স্বাক্ষরবিহীন বাইট আছে bএবং x। আমি গণনা করতে প্রয়োজন bsubহিসাবে b - xএবং baddহিসাবে b + x। যাইহোক, আমি চাই না যে এই অপারেশনগুলির মধ্যে ডুবে যাওয়া / ওভারফ্লো ঘটে। উদাহরণস্বরূপ (সিউডো-কোড):

b = 3; x = 5;
bsub = b - x; // bsub must be 0, not 254

এবং

b = 250; x = 10;
badd = b + x; // badd must be 255, not 4

এটি করার সুস্পষ্ট উপায়ের মধ্যে ব্রাঞ্চিং অন্তর্ভুক্ত রয়েছে:

bsub = b - min(b, x);
badd = b + min(255 - b, x);

আমি কেবল আশ্চর্য হই যে এটি করার আরও ভাল কোনও উপায় আছে, কিছু হ্যাক বিট ম্যানিপুলেশন দ্বারা?


13
y ^ ((x ^ y) & -(x < y))intপ্রকারের জন্য min(x, y)শাখা ছাড়াই মূল্যায়ন । এটি এখন অবধি যা আছে তার ভিত্তিতে এটি একটি চূড়ান্ত সমাধানের অংশ তৈরি করতে পারে।
বাথশেবা


8
এটি কি সি বা সি ++ প্রশ্ন? অনুগ্রহ করে একটি নির্বাচন করুন.
ফুজ

9
@ অ্যালান ক্যাম্পবেল এটিকে স্যাচুরটিং গাণিতিক বলা হয় ।
শফিক ইয়াঘমোর

7
আপনার কি এটি বহনযোগ্য হতে হবে? কারণ আপনি যদি কোনও নির্দিষ্ট আর্কিটেকচারের দিকে তাকান, তবে সম্ভবত একটি দুর্দান্ত একক নির্দেশনা রয়েছে। আমি জানি এআরএমের বাইটের জন্য ভেক্টর সংযোজন এবং বিয়োগ রয়েছে। এক্স ৮86-এ _mm_adds_epi8অন্তর্নিহিত একক নির্দেশনায় 16 বাইট সংযোজন করবে ting
পোরগলজম্প

উত্তর:


86

ব্রাঞ্চফ্রি স্যাচুরটিং গাণিতিক নিবন্ধটি এর জন্য কৌশল সরবরাহ করে:

তাদের সংযোজন সমাধান নিম্নরূপ:

u32b sat_addu32b(u32b x, u32b y)
{
    u32b res = x + y;
    res |= -(res < x);

    return res;
}

uint8_t এর জন্য পরিবর্তিত:

uint8_t  sat_addu8b(uint8_t x, uint8_t y)
{
    uint8_t res = x + y;
    res |= -(res < x);

    return res;
}

এবং তাদের বিয়োগ সমাধান:

u32b sat_subu32b(u32b x, u32b y)
{
    u32b res = x - y;
    res &= -(res <= x);

    return res;
}

uint8_t এর জন্য পরিবর্তিত:

uint8_t sat_subu8b(uint8_t x, uint8_t y)
{
    uint8_t res = x - y;
    res &= -(res <= x);

    return res;
}

4
@ ব্যবহারকারী 1969104 এটি হতে পারে তবে নিবন্ধের মন্তব্য হিসাবে ইঙ্গিত দেওয়া হয়েছে যে আনরি বিয়োগ প্রয়োগ করার আগে স্বাক্ষরবিহীন অবস্থায় কাস্টিং দ্বারা সমাধান করা হয়েছে। ব্যবহারিকতায় এটি দু'টি পরিপূরক ব্যতীত অন্য যে কোনও বিষয়কে মোকাবেলা করার সম্ভাবনা নেই
শফিক ইয়াঘমোর

4
এটি একটি ভাল সি উত্তর হতে পারে, তবে খুব ভাল সি ++ উত্তর নয়।
ইয়াক্ক - অ্যাডাম নেভ্রামুমন্ট

4
@ ইয়াক্ক কী এটিকে "খারাপ" সি ++ উত্তর দেয়? এগুলি মৌলিক গাণিতিক ক্রিয়াকলাপ, এবং কীভাবে এটি কেবল সি হিসাবে বা খারাপ সি ++ হিসাবে ব্যাখ্যা করা হবে তা আমি দেখতে পাই না।
JPhi1618

4
@ JPhi1618 একটি আরও ভাল সি ++ উত্তর template<class T>struct sat{T t;};ওভারলোডেড অপারেটরগুলির সাথে থাকতে পারে যা পরিপূর্ণ হয়? নেমস্পেসের সঠিক ব্যবহার। বেশিরভাগ চিনি।
ইয়াক্ক - অ্যাডাম নেভ্রামুমন্ট

6
@ ইয়াক্ক, আহ, ঠিক আছে আমি কেবল এটি একটি সর্বনিম্ন উদাহরণ হিসাবে দেখেছি যে ওপি প্রয়োজনীয় হিসাবে খাপ খাইয়ে নিতে পারে। আমি বাস্তবায়নের সম্পূর্ণ দেখতে আশা করব না। স্পষ্ট করার জন্য ধন্যবাদ।
JPhi1618

40

একটি সহজ পদ্ধতি হ'ল ওভারফ্লো সনাক্ত করা এবং নীচের মতো অনুসারে মানটি পুনরায় সেট করা

bsub = b - x;
if (bsub > b)
{
    bsub = 0;
}

badd = b + x;
if (badd < b)
{
    badd = 255;
}

জিসিसी -O2 সংকলন করার সময় শর্তসাপেক্ষ অ্যাসাইনমেন্টে ওভারফ্লো চেকটিকে অনুকূল করতে পারে।

অন্যান্য সমাধানের সাথে তুলনা করে কতটা অপ্টিমাইজেশন তা আমি পরিমাপ করেছি। আমার পিসিতে 1000000000+ অপারেশন সহ, এই সমাধানটি এবং @ শফিকিক ইয়াগমুরের গড় গড়ে ৪.২ সেকেন্ড এবং @chux এর গড় গড়ে ৪.৮ সেকেন্ড হয়েছে। এই সমাধানটি আরও পঠনযোগ্য।


4
@ ব্যবহারকারী 4৯473৩৩ এটি অপরিবর্তিত নয়, এটি বহনকারী পতাকার উপর নির্ভর করে শর্তসাপেক্ষ কার্যনির্বাহে অনুকূলিত হয়েছে।
ফুজ

4
হ্যাঁ ইউজার 694733 সঠিক। এটি শর্তসাপেক্ষ কার্যবিবরণীতে অনুকূলিত হয়েছে।
ব্যবহারকারী 1969104

এটি সমস্ত ক্ষেত্রে কাজ করবে না, উদাহরণস্বরূপ ব্যাড: b = 155 x = 201, ব্যাড = 156 এর চেয়ে বড় এবং এটি খ এর চেয়ে বড়। অপারেশনের উপর নির্ভর করে আপনাকে দুটি ভেরিয়েবলের ন্যূনতম () বা সর্বোচ্চ () এর সাথে ফলাফলের তুলনা করতে হবে
ক্রিশ্চিয়ান এফ

@ ক্রিশ্চিয়ানএফ আপনি কিভাবে 155 + 201 = 156 গণনা করবেন? আমি মনে করি এটি 155 + 201 = 356% 256 = 100 হওয়া দরকার I আমি মনে করি না খ, x মানগুলির কোনও সংমিশ্রমে নূন্যতম (), সর্বোচ্চ () প্রয়োজন।
ব্যবহারকারী 1969104

16

বিয়োগের জন্য:

diff = (a - b)*(a >= b);

যোগ:

sum = (a + b) | -(a > (255 - b))

বিবর্তন

// sum = (a + b)*(a <= (255-b)); this fails
// sum = (a + b) | -(a <= (255 - b)) falis too

ধন্যবাদ @ আর_ক্যাপকে

ধন্যবাদ @ নাথান অলিভারকে

এই অনুশীলনটি কেবল কোডিংয়ের মান দেখায়।

sum = b + min(255 - b, a);

জন্য sumসম্ভবত (a + b) | -(a <= (255 - b))?
আর_ক্যাপ

আপনি পারে না sum = ((a + b) | (!!((a + b) & ~0xFF) * 0xFF)) & 0xFFঅভিমানী sizeof(int) > sizeof(unsigned char), কিন্তু এই সৌন্দর্য এত জটিল যে আমি জানি না যদি আপনি (মাথা ব্যাথা ছাড়া) এটা নিয়ে কিছু লাভ হবে।
ব্যবহারকারী 694733

@ ব্যবহারকারী 694733 হ্যাঁ এবং সম্ভবত এটিও (a+b+1)*(a <= (255-b)) - 1
chux - মনিকা পুনরায় ইনস্টল করুন

@ নাথান অলিভার তদারকির জন্য ধন্যবাদ - এর মূল দিকটি হ'ল subসীমা যেমন ছিল তেমন সহজ ছিল 0। তবে অন্যান্য সীমাবদ্ধতাগুলি জটিলতা সৃষ্টি করে এবং ব্যবহারকারী 2079303 মন্তব্য অনুসরণ করে ।
chux

4
@ ব্যবহারকারী 1969104 ওপি "ভাল" (কোড স্পেস বনাম গতির কার্যকারিতা) বা লক্ষ্য প্ল্যাটফর্ম বা সংকলক সম্পর্কে পরিষ্কার ছিল না। আন-পোস্ট করা বৃহত্তর সমস্যার প্রসঙ্গে গতি নির্ধারণ সার্থক করে তোলে।
chux -

13

আপনি যদি জিসিসি বা ঝনঝন সাম্প্রতিক পর্যায়ে যথেষ্ট সংস্করণ ব্যবহার করে থাকেন (তবে আরও কিছু লোকও) আপনি ওভারফ্লো সনাক্ত করতে বিল্ট-ইনগুলি ব্যবহার করতে পারেন ।

if (__builtin_add_overflow(a,b,&c))
{
  c = UINT_MAX;
}

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

আপনাকে ধন্যবাদ, ইরিবোস এটি উপলব্ধ প্ল্যাটফর্মগুলিতে আমি অবশ্যই চেষ্টা করব।
ovk

4
আমি এইটির সাথে ব্র্যাচলেস কোড উত্পন্ন করতে জিসিসি পেতে পারি না, যা কিছুটা হতাশার। এখানে বিশেষত দুর্ভাগ্যজনক বিষয় হ'ল ঝাঁকুনি এগুলির জন্য বিভিন্ন নাম ব্যবহার করে
শফিক ইয়াঘমোর

4
@ সেফালাপড এবং এটি সম্পূর্ণরূপে অ-ক্রসপ্ল্যাটফর্ম, হ্যাক সম্ভবত অন্য একটি সংকলকটিতেও কাজ করে না। একবিংশ শতাব্দীর জন্য ভাল সমাধান নয়।
Ela782

4
@ ইলা 278২ ​​এটি অন্যভাবে অন্যান্য উপায়: 20 ম শতাব্দীর জন্য বিল্ট-ইনগুলি ভাল সমাধান নয়। ভবিষ্যতে আপনাকে স্বাগতম!
সেফালপড

3

সংযোজনের জন্য:

unsigned temp = a+b;  // temp>>8 will be 1 if overflow else 0
unsigned char c = temp | -(temp >> 8);

বিয়োগের জন্য:

unsigned temp = a-b;  // temp>>8 will be 0xFF if neg-overflow else 0
unsigned char c = temp & ~(temp >> 8);

কোনও তুলনা অপারেটর বা গুণকগুলি প্রয়োজন।


3

আপনি যদি সমাবেশ বা আন্তঃব্যক্তি ব্যবহার করতে ইচ্ছুক হন তবে আমার মনে হয় আমার একটি অনুকূল সমাধান রয়েছে have

বিয়োগের জন্য:

আমরা নির্দেশটি ব্যবহার করতে পারিsbb

এমএসভিসিতে আমরা আন্তঃনালী ফাংশন _সববরো_উ 64 ব্যবহার করতে পারি (অন্যান্য বিট উপলভ্য) ব্যবহার করতে পারি।

এটি কীভাবে ব্যবহৃত হয় তা এখানে:

// *c = a - (b + borrow)
// borrow_flag is set to 1 if (a < (b + borrow))
borrow_flag = _subborrow_u64(borrow_flag, a, b, c);

আপনার পরিস্থিতিতে আমরা কীভাবে এটি প্রয়োগ করতে পারি তা এখানে

uint64_t sub_no_underflow(uint64_t a, uint64_t b){
    uint64_t result;
    borrow_flag = _subborrow_u64(0, a, b, &result);
    return result * !borrow_flag;
}

সংযোজনের জন্য:

আমরা নির্দেশটি ব্যবহার করতে পারিadcx

এমএসভিসিতে আমরা আন্তঃনদী ফাংশন _ড্ডকারি_উ 64 ব্যবহার করতে পারি (অন্যান্য বিট উপলব্ধ) ব্যবহার করতে পারি।

এটি কীভাবে ব্যবহৃত হয় তা এখানে:

// *c = a + b + carry
// carry_flag is set to 1 if there is a carry bit
carry_flag = _addcarry_u64(carry_flag, a, b, c);

আপনার পরিস্থিতিতে আমরা কীভাবে এটি প্রয়োগ করতে পারি তা এখানে

uint64_t add_no_overflow(uint64_t a, uint64_t b){
    uint64_t result;
    carry_flag = _addcarry_u64(0, a, b, &result);
    return !carry_flag * result - carry_flag;
}

আমি এটিকে বিয়োগফলের মতো পছন্দ করি না, তবে আমার মনে হয় এটি নিখরচায়।

অ্যাড ওভারফ্লোস carry_flag = 1,। না-ইনগেশন carry_flag0 ফলন করে, তাই !carry_flag * result = 0যখন ওভারফ্লো হয়। এবং যেহেতু 0 - 1স্বাক্ষরযুক্ত স্বাক্ষরিত অবিচ্ছেদ্য মানটিকে এটি সর্বাধিক স্থির করে দেবে, তাই কোনও বহন না থাকলে ফাংশন সংযোজনের ফলাফলটি প্রদান করবে এবং বহনকারী নির্বাচিত অবিচ্ছেদ্য মানের সর্বাধিক ফিরিয়ে দেবে।


4
আপনি উল্লেখ করতে চাইতে পারেন যে এই উত্তরটি একটি নির্দিষ্ট নির্দেশ-সেট আর্কিটেকচারের জন্য (x86?) এবং প্রতিটি টার্গেট আর্কিটেকচারের জন্য পুনর্নির্মাণের প্রয়োজন হবে (স্পার্ক, এমআইপিএস, এআরএম, ইত্যাদি)
টবি স্পিড

2

এই সম্পর্কে কি:

bsum = a + b;
bsum = (bsum < a || bsum < b) ? 255 : bsum;

bsub = a - b;
bsub = (bsub > a || bsub > b) ? 0 : bsub;

আমি (স্পষ্ট?) টাইপ ঠিক করেছিলাম, তবে আমি এখনও এটি সঠিক বলে মনে করি না।
বাথশেবা

এর মধ্যে শাখা-প্রশাখাও অন্তর্ভুক্ত রয়েছে।
ফুজ

আমি এই উত্তরটি কেবল অপ্টিমাইজেশন ছাড়াই সমাবেশে একটি দ্রুত প্রশ্ন মুছে ফেলব, টের্নারি অপারেটর এবং যদি / অন্য বিবৃতিতে পার্থক্য কী?

@ জিআরসি কোন পার্থক্য নেই।
ফুজ

@ জিআরসি এফজেডএক্সএক্সএক্সএল ঠিক আছে তবে যথারীতি নিজেকে চেষ্টা করুন। এমনকি যদি আপনি সমাবেশ না জানেন (কেবলমাত্র আপনার কাছে কিছু স্পষ্ট না হয় তবে আপনি এখানে একটি প্রশ্ন করতে পারেন), কেবল আপনি যে দৈর্ঘ্য / নির্দেশাবলী জানেন তা পরীক্ষা করে।
edmz

2

সমস্ত স্বাক্ষরবিহীন বাইট পাটিগণিতে করা যেতে পারে

// Addition without overflow
return (b > 255 - a) ? 255 : a + b

// Subtraction without underflow
return (b > a) ? 0 : a - b;

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

2

আপনি যদি দুটি বাইট দিয়ে এটি করতে চান তবে সহজতম কোডটি ব্যবহার করুন।

আপনি যদি বিশ বিলিয়ন বাইট দিয়ে এটি করতে চান, আপনার প্রসেসরে কী ভেক্টর নির্দেশাবলী পাওয়া যায় এবং সেগুলি ব্যবহার করা যায় কিনা তা পরীক্ষা করে দেখুন। আপনি দেখতে পাবেন যে আপনার প্রসেসর একক নির্দেশ দিয়ে এই অপারেশনগুলির 32 কাজ করতে পারেন।


2

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


7
লাইব্রেরিটি কীভাবে ব্যবহার করা যায় তার একটি উদাহরণ প্রদান করা এটির আরও ভাল উত্তর বয়ে আনবে। তদুপরি, তারা কি একটি brachless গ্যারান্টি সরবরাহ করে?
শফিক ইয়াঘমোর

গ্রন্থাগারের বিস্তৃত ডকুমেন্টেশন এবং উদাহরণ রয়েছে। তবে দিনের শেষে এটি যথাযথ শিরোনাম এবং ইন্টের জন্য নিরাপদ <বিকল্প> প্রতিস্থাপনের মতোই সহজ।
রবার্ট রেমি

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

1

আপনি যদি এই পদ্ধতিগুলিকে অনেক কল করেন তবে দ্রুততম উপায়টি বিট ম্যানিপুলেশন নয় তবে সম্ভবত একটি সন্ধানের টেবিল। প্রতিটি ক্রিয়াকলাপের জন্য 511 দৈর্ঘ্যের অ্যারের সংজ্ঞা দিন। বিয়োগের জন্য উদাহরণ (বিয়োগ)

static unsigned char   maxTable[511];
memset(maxTable, 0, 255);           // If smaller, emulates cutoff at zero
maxTable[255]=0;                    // If equal     - return zero
for (int i=0; i<256; i++)
    maxTable[255+i] = i;            // If greater   - return the difference

অ্যারে স্থির এবং একবারে আরম্ভ করা হয়। এখন আপনার বিয়োগটি ইনলাইন পদ্ধতি বা প্রাক-সংকলক ব্যবহার করে সংজ্ঞায়িত করা যেতে পারে:

#define MINUS(A,B)    maxTable[A-B+255];

কিভাবে এটা কাজ করে? ভাল আপনি স্বাক্ষরযুক্ত অক্ষরের জন্য সমস্ত সম্ভাব্য বিয়োগগুলি প্রাক-গণনা করতে চান। ফলাফলগুলি -255 থেকে 255-এ পরিবর্তিত হয়, মোট 511 টি ভিন্ন ফলাফল। আমরা সম্ভাব্য সকল ফলাফলের একটি অ্যারে সংজ্ঞায়িত করি তবে সিতে আমরা এটি ব্যবহার করে এমন নেতিবাচক সূচকগুলি থেকে অ্যাক্সেস করতে পারি না ([A-B + 255])। আপনি অ্যারের কেন্দ্রে একটি পয়েন্টার সংজ্ঞায়িত করে এই ক্রিয়াটি সরাতে পারেন।

const unsigned char *result = maxTable+255;
#define MINUS(A,B)    result[A-B];

এটি ব্যবহার করুন:

bsub  = MINUS(13,15); // i.e 13-15 with zero cutoff as requested

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

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

আপনি যদি বিট ক্রিয়াকলাপের জন্য জেদ করেন তবে যে উত্তরগুলি ব্যবহার করে (এ> বি) ভুল are এটি এখনও শাখা হিসাবে প্রয়োগ করা যেতে পারে। সাইন-বিট কৌশলটি ব্যবহার করুন

// (num1>num2) ? 1 : 0
#define        is_int_biggerNotEqual( num1,num2) ((((__int32)((num2)-(num1)))&0x80000000)>>31)

এখন আপনি এটি বিয়োগ এবং সংযোজনের গণনার জন্য ব্যবহার করতে পারেন।

আপনি যদি শাখা ব্যবহার ছাড়াই সর্বোচ্চ (), মিনিট () ফাংশনগুলি অনুকরণ করতে চান:

inline __int32 MIN_INT(__int32 x, __int32 y){   __int32 d=x-y; return y+(d&(d>>31)); }              

inline __int32 MAX_INT(__int32 x, __int32 y){   __int32 d=x-y; return x-(d&(d>>31)); }

আমার উপরের উদাহরণগুলি 32 বিট পূর্ণসংখ্যার ব্যবহার করে। আপনি এটি 64 এ পরিবর্তন করতে পারেন, যদিও আমি বিশ্বাস করি 32 বিট গণনা কিছুটা দ্রুত চলে run আপনার উপর


4
সম্ভবত এটি সম্ভবত হবে না: প্রথমত, অবশ্যই, টেবিলটি লোড করা ধীর is বিট অপারেশনগুলিতে 1 চক্র লাগে, মেমরি থেকে লোড হতে প্রায় 80 এনএস লাগে; এমনকি এল 1 ক্যাশে থেকে আমরা 20 এনএস এর সীমার মধ্যে রয়েছি, যা একটি 3GHz সিপিইউতে প্রায় 7 চক্র।
edmz

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

4
আমি বলতে চাইছিলাম যে একক বিটওয়াইজ অপারেশনগুলিতে 1 টি চক্র লাগে, স্বাভাবিকভাবেই নিবন্ধকের অপারেশনগুলি ধরে। শফিক যে কোডটি দেখিয়েছে তার সাথে ঝনঝন 4 টি প্রাথমিক নির্দেশকে আউটপুট দেয়। এছাড়াও (x > y), শাখাবিহীন।
edmz

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

4
এল 1 ক্যাশে 20 এনএস এর চেয়ে অনেক দ্রুত, এটি সম্ভবত 4 প্রসেসরের চক্রের ক্রম। এবং সম্ভবত অন্যথায় অব্যবহৃত এক্সিকিউশন ইউনিট ব্যবহার করা হবে এবং যাইহোক পুরোপুরি পাইপলাইন করা হবে। এটা মাপো. এবং 20ns 3 গিগাহার্টজ সিপিইউতে 60 টি চক্র।
gnasher729
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.