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