मैंने unsigned long long
की सरणी का उपयोग करके 256 बिट पूर्णांक लागू किया है और कैर्री के साथ जोड़ने को लागू करने के लिए x64 असेंबली का उपयोग किया है।
#include "stdafx.h"
extern "C" void add256(unsigned long long *a, unsigned long long * b, unsigned long long *c);
int _tmain(int argc, _TCHAR* argv[])
{
unsigned long long a[4] = {0x8000000000000001, 2, 3, 4};
unsigned long long b[4] = {0x8000000000000005, 6, 7, 8};
unsigned long long c[4] = {0, 0, 0, 0};
add256(a, b, c); // c[] == {6, 9, 10, 12};
return 0;
}
add256
विधानसभा में कार्यान्वित किया जाता है:: यहाँ सी ++ फोन करने वाले है
; void add256(unsigned long long *a, unsigned long long * b, unsigned long long *c)
.CODE
PUBLIC add256
add256 PROC
mov qword ptr [rsp+18h],r8
mov qword ptr [rsp+10h],rdx
mov qword ptr [rsp+8],rcx
push rdi
; c[0] = a[0] + b[0];
mov rax,qword ptr 16[rsp]
mov rax,qword ptr [rax]
mov rcx,qword ptr 24[rsp]
add rax,qword ptr [rcx]
mov rcx,qword ptr 32[rsp]
mov qword ptr [rcx],rax
; c[1] = a[1] + b[1] + CARRY;
mov rax,qword ptr 16[rsp]
mov rax,qword ptr [rax+8]
mov rcx,qword ptr 24[rsp]
adc rax,qword ptr [rcx+8]
mov rcx,qword ptr 32[rsp]
mov qword ptr [rcx+8],rax
; c[2] = a[2] + b[2] + CARRY;
mov rax,qword ptr 16[rsp]
mov rax,qword ptr [rax+10h]
mov rcx,qword ptr 24[rsp]
adc rax,qword ptr [rcx+10h]
mov rcx,qword ptr 32[rsp]
mov qword ptr [rcx+10h],rax
; c[3] = a[3] + b[3] + CARRY;
mov rax,qword ptr 16[rsp]
mov rax,qword ptr [rax+18h]
mov rcx,qword ptr 24[rsp]
adc rax,qword ptr [rcx+18h]
mov rcx,qword ptr 32[rsp]
mov qword ptr [rcx+18h],rax
; }
pop rdi
ret
add256 endp
end
मैं तुम्हें यह दर्शाता है कि आप एक अनुकरणीय समाधान कैरी के साथ जोड़ने नहीं करना चाहता था पता है, और यदि कोई उच्च प्रदर्शन समाधान चाहता था, लेकिनके लिए
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
unsigned long long a[4] = {0x8000000000000001, 2, 3, 4};
unsigned long long b[4] = {0x8000000000000005, 6, 7, 8};
unsigned long long c[4] = {0, 0, 0, 0};
c[0] = a[0] + b[0]; // 6
c[1] = a[1] + b[1] + (c[0] < a[0]); // 9
c[2] = a[2] + b[2] + (c[1] < a[1]); // 10
c[3] = a[3] + b[3] + (c[2] < a[2]); // 12
return 0;
}
हमें इस "256 मेगाबिट एड" के बारे में और बताएं। यह काफी संभावना है कि एक बार सिमड का उपयोग करके कई जोड़ों को जोड़ना काफी तेज होगा, भले ही कारों को एक अतिरिक्त कदम के रूप में संभाला जाना चाहिए। –
मैंने पहले से ही थोड़ा सा शोध किया था। Http://stackoverflow.com/questions/8866973/can-long-integer-routines-benefit-from-sse देखें। – jnm2
@ jnm2 - x64 तरीका अलग असेंबली कोड लिख रहा है और इसे आपके C++ फ़ंक्शन से कॉल करता है। असेंबलर पहले से ही पैकेज का हिस्सा है। –