আধুনিক সিপিইউগুলিতে কেন কোনও নির্দেশনা নেই?


52

X86 ডিজাইনার (বা পাশাপাশি অন্যান্য সিপিইউ আর্কিটেকচার) কেন এটি অন্তর্ভুক্ত না করার সিদ্ধান্ত নিয়েছে? এটি একটি লজিক গেট যা অন্যান্য লজিক গেটগুলি তৈরি করতে ব্যবহার করা যেতে পারে, সুতরাং এটি একক নির্দেশ হিসাবে দ্রুত। শৃঙ্খলাবদ্ধ notandনির্দেশাবলীর পরিবর্তে (উভয় থেকেই তৈরি করা হয়েছে nand) কেন কোনও nandনির্দেশনা নেই ?.


20
ন্যান্দ নির্দেশের জন্য আপনার কী ইউসকেস রয়েছে? সম্ভবত x86 ডিজাইনাররা কখনও
কোনওটি

16
এআরএমের BICনির্দেশনা রয়েছে, যা তা a & ~b। আর্ম থাম্ব -2 এর ORNনির্দেশ রয়েছে যা ~(a | b)। এআরএম বেশ আধুনিক। সিপিইউ ইন্সট্রাকশন সেটে কোনও নির্দেশকে এনকোডিংয়ের ব্যয় হয়। সুতরাং কেবলমাত্র সবচেয়ে "দরকারী" ব্যক্তিরা আইএসএতে প্রবেশ করছে।
ইউজিন শ।

24
@ আম্মু ~(((a << 1) | (b >> 1)) | 0x55555555)আমাদেরও নির্দেশনা থাকতে পারে। উদ্দেশ্যটি এমন হবে যাতে ~(((a << 1) | (b >> 1)) | 0x55555555)6. এর পরিবর্তে কোনও একক নির্দেশিকায় অনুবাদ করা যায় So সুতরাং, কেন নয়?
ব্যবহারকারী 253751

11
@ আম্মু: এটি ইউসকেস নয় এবং এটিও ~ না! একটি ব্যবহারের হাতছাড়া হ'ল বাধ্যতামূলক কারণ কেন সেই নির্দেশটি কার্যকর এবং যেখানে এটি প্রয়োগ করা যায়। আপনার যুক্তি "নির্দেশনাটি সেখানে থাকা উচিত যাতে এটি ব্যবহার করা যায়" বলার মতো তবে প্রশ্নটি "এটির জন্য এটি কী ব্যবহার করবেন এটি এত গুরুত্বপূর্ণ যে এটি সম্পদ ব্যয় করতে কার্যকর"।
প্লাজমাএইচএইচ

4
আমি ৪৫ বছর ধরে প্রোগ্রামিং করছি, কয়েকটি সংকলক লিখেছি এবং আইএমপি-র মতো পাওয়া গেলে কিছু জঘন্য লজিকাল অপারেটর ব্যবহার করেছি, তবে আমি কখনই ন্যানড অপারেটর বা নির্দেশের ব্যবহার করতে পারি নি।
ব্যবহারকারী 207421

উত্তর:


62

http://www.ibm.com/support/ জ্ঞানসেন্টিটার / এসএসইউ_এক্স_61/com.ibm.aix.alangref/idalangref_nand_nd_instrs.htm: পাওয়ারের ননড রয়েছে।

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

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


5
বিট-সেট ভেরিয়েবলের বিটগুলি বন্ধ করতে সাধারণত @ সুপের্যাট অ্যান্ড নট ব্যবহার করা হয়। উদাহরণস্বরূপif(windowType & ~WINDOW_RESIZABLE) { ... do stuff for variable-sized windows ... }
আদিব

2
@ আদিব: হ্যাঁ "এবং না" এর একটি আকর্ষণীয় বৈশিষ্ট্যটি হ'ল "বিটওয়াইজ নট" অপারেটরের বিপরীতে [~] ফলাফলের আকারটি কোনও ব্যাপার নয়। যদি fooএকটি uint64_t হয়, বিবৃতিটি foo &= ~something;কখনও কখনও উদ্দেশ্য থেকে আরও বিট সাফ করতে পারে, তবে যদি &~=অপারেটর থাকে তবে এ জাতীয় সমস্যা এড়ানো যেতে পারে।
সুপারক্যাট

6
@ অ্যাডিব যদি WINDOW_RESIZABLEধ্রুবক হয় তবে ~WINDOW_RESIZABLEসংকলনের সময় কোনও অপ্টিমাইজারের মূল্যায়ন করা উচিত , সুতরাং এটি রানের সময়টি কেবলমাত্র একটি অ্যান্ড এন্ড।
আলেফজেরো

4
@ মার্করানসম: না, কারণ এবং প্রভাব গণনা ইতিহাস থেকে সম্পূর্ণ সঠিক। মানব সমাবেশ প্রোগ্রামারগুলির পরিবর্তে সংকলকগুলির জন্য অনুকূলিত সিপিইউগুলি ডিজাইনের এই ঘটনাটি আরআইএসসি আন্দোলনের অংশ ছিল (যদিও, আরআইএসসি আন্দোলনটি কেবলমাত্র সেই দিকটির চেয়েও বিস্তৃত)। সংকলকগুলির জন্য ডিজাইন করা সিপিইউগুলিতে এআরএম এবং আটমেল এভিআর অন্তর্ভুক্ত রয়েছে। নব্বইয়ের দশকের শেষের দিকে এবং 00 এর দশকের প্রথম দিকে লোকেরা সিপিইউ নির্দেশিকা সেট ডিজাইনের জন্য সংকলক লেখক এবং ওএস প্রোগ্রামারদের ভাড়া করেছিল
স্ল্যাবেটম্যান

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

31

যেমন একটি ALU ফাংশন খরচ হয়

1) যুক্তি যা ফাংশনটি নিজেই সম্পাদন করে

2) নির্বাচক যা সমস্ত ALU ফাংশন থেকে অন্যের পরিবর্তে এই ফাংশন ফলাফলটি নির্বাচন করে

3) নির্দেশিকা সেটটিতে এই বিকল্পটি রাখার জন্য ব্যয় (এবং অন্য কোনও কার্যকর ফাংশন না থাকা)

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


29

এটিকে ঘুরিয়ে দিন - প্রথমে দেখুন নন্দ কেন হার্ডওয়্যার লজিক ডিজাইনে জনপ্রিয় ছিল - এর বেশ কয়েকটি দরকারী বৈশিষ্ট্য রয়েছে। তারপরে জিজ্ঞাসা করুন যে সেই বৈশিষ্ট্যগুলি এখনও কোনও সিপিইউ নির্দেশিকায় প্রয়োগ হয় ...

টিএল / ডিআর - তারা দেয় না, সুতরাং এর পরিবর্তে এবং, বা না বা ব্যবহার করার কোনও খারাপ দিক নেই।

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

এবং অন্যান্য নির্দেশাবলী একত্রিত করার জন্য আপনাকে যে পরিমাণ বার বার করতে হবে তা অদৃশ্যভাবে ছোট - যথেষ্ট যাতে নন্দ সত্যিকার অর্থে শিক্ষণ সেটে তার স্থান অর্জন করতে পারে না।


1
যে ক্ষেত্রে ইনপুট বিচ্ছিন্নতা প্রয়োজন হয় না, "এবং না" হার্ডওয়্যারে খুব সস্তা বলে মনে হয়। 1977 এর পিছনে আমি "এক্সওআর" ফাংশন সম্পাদন করতে দুটি ট্রানজিস্টর এবং আলোর প্রতি দুটি ডায়োড ব্যবহার করে আমার পিতামাতার ট্রেলারের জন্য টার্ন-সিগন্যাল নিয়ন্ত্রক ডিজাইন করেছি [বাম বাতি == জোর (বাম সংকেত, ব্রেক); ডান প্রদীপ == জোর (ডান সংকেত, ব্রেক)], প্রতিটি আলোর জন্য মূলত দু'টি এবং নন ফাংশন wire আমি এলএসআই ডিজাইনে ব্যবহৃত এ জাতীয় কৌশলগুলি দেখিনি, তবে আমি মনে করব যে টিটিএল বা এনএমওএসে, যেখানে কোনও ইনপুট খাওয়ানো যথেষ্ট পরিমাণে ড্রাইভের ক্ষমতা অর্জন করতে পারে, এই জাতীয় কৌশলগুলি সার্কিটরি বাঁচাতে পারে।
সুপারক্যাট

12

আমি এখানে ব্রায়ান এবং ওয়েটার এবং পিজেসি 50 এর সাথে একমত হতে চাই।

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

এক্স 86 বিবেচনা করুন: AND(এটি একটি "এবং" অপারেশন) সম্ভবত খুব দ্রুত। একই জন্য যায় NOT। আসুন কিছুটা উদাসীনতার দিকে নজর দিন:

ইনপুট কোড:

#include <immintrin.h>
#include <stdint.h>

__m512i nand512(__m512i a, __m512i b){return ~(a&b);}
__m256i nand256(__m256i a, __m256i b){return ~(a&b);}
__m128i nand128(__m128i a, __m128i b){return ~(a&b);}
uint64_t nand64(uint64_t a, uint64_t b){return ~(a&b);}
uint32_t nand32(uint32_t a, uint32_t b){return ~(a&b);}
uint16_t nand16(uint16_t a, uint16_t b){return ~(a&b);}
uint8_t nand8(uint8_t a, uint8_t b){return ~(a&b);}

সমাবেশ উত্পাদন কমান্ড:

gcc -O3 -c -S  -mavx512f test.c

আউটপুট সমাবেশ (সংক্ষিপ্ত):

    .file   "test.c"
nand512:
.LFB4591:
    .cfi_startproc
    vpandq  %zmm1, %zmm0, %zmm0
    vpternlogd  $0xFF, %zmm1, %zmm1, %zmm1
    vpxorq  %zmm1, %zmm0, %zmm0
    ret
    .cfi_endproc
nand256:
.LFB4592:
    .cfi_startproc
    vpand   %ymm1, %ymm0, %ymm0
    vpcmpeqd    %ymm1, %ymm1, %ymm1
    vpxor   %ymm1, %ymm0, %ymm0
    ret
    .cfi_endproc
nand128:
.LFB4593:
    .cfi_startproc
    vpand   %xmm1, %xmm0, %xmm0
    vpcmpeqd    %xmm1, %xmm1, %xmm1
    vpxor   %xmm1, %xmm0, %xmm0
    ret
    .cfi_endproc
nand64:
.LFB4594:
    .cfi_startproc
    movq    %rdi, %rax
    andq    %rsi, %rax
    notq    %rax
    ret
    .cfi_endproc
nand32:
.LFB4595:
    .cfi_startproc
    movl    %edi, %eax
    andl    %esi, %eax
    notl    %eax
    ret
    .cfi_endproc
nand16:
.LFB4596:
    .cfi_startproc
    andl    %esi, %edi
    movl    %edi, %eax
    notl    %eax
    ret
    .cfi_endproc
nand8:
.LFB4597:
    .cfi_startproc
    andl    %esi, %edi
    movl    %edi, %eax
    notl    %eax
    ret
    .cfi_endproc

আপনি দেখতে পাচ্ছেন, সাব -৪৪-আকারের ডেটা ধরণের জন্য, জিনিসগুলি কেবলমাত্র দীর্ঘ হিসাবে পরিচালনা করা হয় (সুতরাং এবং আমি এবং l নয় ), যেহেতু এটি আমার সংকলকের "নেটিভ" বিটউইথ, যেমনটি মনে হয়।

movএর মধ্যে যে সত্যটি রয়েছে তা কেবলমাত্র ফিজারের eaxরিটার্ন মান সহকারে নিবন্ধকের কারণেই। সাধারণত, আপনি ediফলাফলের সাথে গণনা করার জন্য সাধারণ উদ্দেশ্যে নিবন্ধে গণনা করতে চান।

64 বিট জন্য, এটি একই - শুধু (অত: পর, trailing "চতুর্ভুজ" সঙ্গে q) শব্দ, এবং rax/ rsiপরিবর্তে eax/ edi

দেখে মনে হচ্ছে যে 128 বিট অপারেশন এবং বৃহত্তর জন্য, ইন্টেল "না" অপারেশন বাস্তবায়নের যত্ন নেননি; পরিবর্তে, সংকলক একটি সর্ব- 1নিবন্ধ উত্পাদন করে (নিজের সাথে নিবন্ধের স্ব-তুলনা, vdcmpeqdনির্দেশাবলীতে নিবন্ধে সঞ্চিত ফলাফল ) এবং xorএটি।

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


10

প্রথমে বিটওয়াইজ এবং লজিকাল অপারেশন গুলিয়ে ফেলবেন না।

বিটওয়াইজ অপারেশনগুলি সাধারণত বিটফিল্ডে / পরিষ্কার / টগল / চেক বিট সেট করতে ব্যবহৃত হয়। এই অপারেশনগুলির কোনওটির জন্যই ন্যানডের প্রয়োজন হয় না ("এবং না", এটি "বিট ক্লিয়ার" হিসাবে বেশি পরিচিত)।

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


10

NAND প্রায়শই সরাসরি প্রয়োগ করা হয় না কারণ AND নির্দেশাবলী স্পষ্টতই আপনাকে ন্যানড শর্তে ঝাঁপিয়ে পড়ার ক্ষমতা দেয়।

সিপিইউতে যৌক্তিক ক্রিয়াকলাপ সম্পাদন করা প্রায়শই একটি পতাকা নিবন্ধে বিট সেট করে।

বেশিরভাগ পতাকা নিবন্ধকের একটি শূন্য পতাকা রয়েছে। লজিকাল অপারেশনের ফলাফল শূন্য হলে শূন্য পতাকা সেট করা হয় এবং অন্যথায় সাফ করা হয়।

বেশিরভাগ আধুনিক সিপিইউতে একটি লাফের নির্দেশনা রয়েছে যা শূন্য পতাকা সেট করা থাকলে লাফ দেয়। তাদের একটি আইসট্রেশনও রয়েছে যা শূন্য পতাকাটি সেট না করা থাকলে লাফ দেয়।

এবং এবং ন্যানড পরিপূরক। যদি একটি অ্যান্ড অপারেশনের ফলাফল শূন্য হয় তবে ন্যানড অপারেশনের ফলাফলটি 1, এবং বিপরীত।

সুতরাং আপনি যদি দুটি মানের নান্দটি সত্য হয় যদি ওট জাম্প চান তবে কেবল অ্যান্ড অপারেশন করুন এবং শূন্য পতাকাটি সেট করা থাকলে লাফ দিন।

সুতরাং আপনি যদি দুটি মানের ন্যান্ডটি মিথ্যা হয় যদি ওট জাম্প চান তবে কেবল অ্যান্ড অপারেশন করুন এবং শূন্য পতাকাটি পরিষ্কার হলে লাফ দিন।


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

এটি সেরা উত্তর হওয়া উচিত ছিল। শূন্য পতাকা সংক্রান্ত ক্রিয়াকলাপগুলি NANDকে যৌক্তিক ক্রিয়াকলাপের জন্য অতিরিক্তভাবে পরিণত করে যেমন AND + JNZ এবং AND + JZ যথাক্রমে যথাক্রমে সংক্ষিপ্ত সার্কিট / লজিক্যাল এবং ন্যান্ড হয়, উভয়ই একই সংখ্যক অপকোড নেয়।
মিথ্যা রায়ান

4

যেহেতু কিছু সস্তা , এর অর্থ এটি ব্যয়বহুল

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

বা এটি আর্থিক উপকরণগুলির সাথে তুলনা করুন: আপনি কেবল 0.01% রিটার্নের সাথে একটি $ 1 বন্ড কিনবেন? না, আপনি যতটা ভাল ফিরতি দিয়ে 10 ডলার বন্ড কিনতে না পারা পর্যন্ত আপনি ডলারগুলি বাঁচাতে পারবেন। একটি সিপিইউতে সিলিকন বাজেটের সাথে একই: এটি ন্যান্ডের মতো অনেক সস্তা তবে অকেজো অপ্সকে অক্ষ দেওয়া কার্যকর এবং সেভ করা ট্রানজিস্টরগুলিকে আরও ব্যয়বহুল তবে সত্যই দরকারী।

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


nopঅন্য সমস্ত লজিক গেটগুলি বাস্তবায়ন করতে পারে না, তবে nandবা norসফটওয়্যারের সিপিইউতে প্রয়োগ করা কোনও নির্দেশাবলী কার্যকরভাবে পুনরায় তৈরি করতে পারে। আমরা যদি আরআইএসসি পন্থা গ্রহণ করি তবে তা ..
আমুমু

@ আম্মু আমার মনে হয় আপনি মিশে যাচ্ছেন gateএবং instruction। গেটগুলি নির্দেশের প্রয়োগের জন্য ব্যবহৃত হয়, অন্যভাবে নয়। NOPএকটি নির্দেশ, গেট নয়। এবং হ্যাঁ, সিপিইউগুলিতে সমস্ত নির্দেশাবলী বাস্তবায়নের জন্য কয়েক হাজার বা এমনকি কয়েক মিলিয়ন ননড গেট রয়েছে। শুধু "ন্যান্ড" নির্দেশনা নয়।
এজেন্ট_এল

2
@ আমুমু এটি আরআইএসসি পদ্ধতির নয় :) এটি "বিস্তৃত বিমূর্ততা ব্যবহার করুন" পদ্ধতির, যা খুব নির্দিষ্ট অ্যাপ্লিকেশনগুলির বাইরে খুব কার্যকর নয়। অবশ্যই, nandএকটি গেট যা অন্য গেটগুলি প্রয়োগ করতে ব্যবহার করা যেতে পারে; তবে আপনার কাছে ইতিমধ্যে অন্যান্য সমস্ত নির্দেশাবলী রয়েছে । কোনও nandনির্দেশিকা ব্যবহার করে তাদের পুনরায় বাস্তবায়ন করা ধীর হবে । এবং এগুলি সহ্য করতে খুব বেশিবার ব্যবহৃত হয়, আপনার চেরি-বাছাই করা নির্দিষ্ট উদাহরণের বিপরীতে যেখানে nandসংক্ষিপ্ত কোড তৈরি হবে ( দ্রুত কোড নয়, কেবল ছোট); তবে এটি অত্যন্ত বিরল, এবং সুবিধাটি কেবল মূল্য ব্যয় করা যায় না।
লুয়ান

@ আম্মু যদি আমরা আপনার পদ্ধতির ব্যবহার করি তবে আমাদের অবস্থানিক সংখ্যা থাকবে না। আপনি যখন ((((()))))5 এর পরিবর্তে কেবল বলতে পারেন , ঠিক কী? পাঁচটি কেবল একটি নির্দিষ্ট সংখ্যা, সেভাবে খুব সীমাবদ্ধ - সেটগুলি আরও সাধারণ হয়: পি
লুয়ান

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

3

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

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

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

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


2

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


0

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

ন্যানড, এনওআর এবং এক্সএনওআর খুব কমই প্রয়োজন হয়। ক্লাসিকাল বিটওয়াইজ অপারেটরগুলি এবং, বা এবং এক্সওআর ছাড়াও, কেবল এএনএন ( ~a & b) - যা ন্যানড নয় ~(a & b)) - এর ব্যবহারিক ইউটিলিটি থাকবে। যদি কোনও হয়, একটি সিপিইউ এর বাস্তবায়ন করা উচিত (এবং প্রকৃতপক্ষে কিছু সিপিইউ এ্যান্ডএন বাস্তবায়ন করে)।

অ্যান্ডএন এর ব্যবহারিক ইউটিলিটি ব্যাখ্যা করার জন্য, কল্পনা করুন যে আপনার কাছে বিটমাস্ক রয়েছে যা অনেকগুলি বিট ব্যবহার করে তবে আপনি কেবল সেগুলির কয়েকটিতে আগ্রহী যা নিম্নলিখিত:

enum my_flags {
    IT_IS_FRIDAY = 1,
    ...
    IT_IS_WARM = 8,
    ...
    THE_SUN_SHINES = 64,
    ...
};

সাধারণত আপনি বিটমাস্কে আপনার আগ্রহের বিটগুলি যাচাই করতে চান

  1. তারা সব প্রস্তুত
  2. কমপক্ষে একটি সেট করা আছে
  3. কমপক্ষে একটি সেট করা হয়নি
  4. কিছুই সেট করা হয় না

আসুন আপনার আগ্রহের বিটগুলি একত্রিত করে শুরু করুন:

#define BITS_OF_INTEREST (IT_IS_FRIDAY | IT_IS_WARM | THE_SUN_SHINES)

1. সমস্ত আগ্রহের বিট সেট করা হয়েছে: বিটওয়াইড এন্ডএন + লজিক্যাল নয়

আসুন বলুন যে আপনার আগ্রহের বিটগুলি সেট করা আছে কিনা তা আপনি জানতে চান। আপনি এটি দেখতে পারেন (my_bitmask & IT_IS_FRIDAY) && (my_bitmask & IT_IS_WARM) && (my_bitmask & THE_SUN_SHINES)। তবে সাধারণত আপনি এটি ভেঙে যাবেন

unsigned int life_is_beautiful = !(~my_bitmask & BITS_OF_INTEREST);

2. কমপক্ষে এক বিট আগ্রহ সেট করা হয়েছে: বিটওয়াইস এবং

এখন বলি যে আপনি জানতে চান কমপক্ষে এক বিট আগ্রহ সেট করা আছে কিনা interest আপনি এটি হিসাবে দেখতে পারেন (my_bitmask & IT_IS_FRIDAY) || (my_bitmask & IT_IS_WARM) || (my_bitmask & THE_SUN_SHINES)। তবে সাধারণত আপনি এটি ভেঙে যাবেন

unsigned int life_is_not_bad = my_bitmask & BITS_OF_INTEREST;

সুদের 3. কমপক্ষে এক বিট হয় না সেট করুন:, bitwise ANDN

এখন আসুন আমরা বলি যে আপনি জানতে চান যদি কমপক্ষে এক বিট আগ্রহ সেট করা না থাকে । আপনি এটি হিসাবে দেখতে পারেন !(my_bitmask & IT_IS_FRIDAY) || !(my_bitmask & IT_IS_WARM) || !(my_bitmask & THE_SUN_SHINES)। তবে সাধারণত আপনি এটি ভেঙে যাবেন

unsigned int life_is_imperfect = ~my_bitmask & BITS_OF_INTEREST;

৪. কিছুটা আগ্রহের সেট করা হয়নি: বিটওয়াইস এবং + লজিক্যাল নয়

এখন বলা যাক যে আপনি আগ্রহের সমস্ত বিট সেট না করা হয়েছে তা জানতে চান । আপনি এটি হিসাবে দেখতে পারেন !(my_bitmask & IT_IS_FRIDAY) && !(my_bitmask & IT_IS_WARM) && !(my_bitmask & THE_SUN_SHINES)। তবে সাধারণত আপনি এটি ভেঙে যাবেন

unsigned int life_is_horrible = !(my_bitmask & BITS_OF_INTEREST);

এগুলি বিটমাস্কে সঞ্চালিত সাধারণ ক্রিয়াকলাপগুলি, এবং ক্লাসিকাল বিটওয়াইস ওআর এবং এক্সওআর। আমি যদিও যে মনে করেন একটি ভাষা (যা নয় একটি CPU- র ), bitwise NAND অন্তর্ভুক্ত করা উচিত, না এবং XNOR অপারেটার (যার প্রতীক হবে ~&, ~|এবং ~^), সত্ত্বেও কদাচিৎ ব্যবহৃত। আমি একটি ভাষায় ANDN অপারেটর অন্তর্ভুক্ত হবে না যদিও, এটা বিনিময় না যেহেতু ( a ANDN bহিসাবে একই নয় b ANDN aলিখতে ভাল -) ~a & bপরিবর্তে a ANDN b, সাবেক শো আরো পরিষ্কারভাবে অপারেশন asimmetry।

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