2013-03-30 5 views
-1

Visual Studio에서 masm 인라인 어셈블러로 변환 된 512 비트 (큰 int)를 추가하는 C++ 코드를 만들려고합니다. 캐리는 아래 링크에 표시된 C++와 같이 매우 중요합니다. Visual Studio의 마스크 인라인 어셈블러에 C++을 표현해야합니다.이 렌즈를 단순화하여 더 빨리 만들 수 있습니까?

나는 masm에서이 작업을 시도했으나 느린 속도였습니다. 악성 코드 코드

. C++ 그것은

mov eax, [edx + 4] 
adc eax, [ebx + 4] 
mov [ebx + 4], eax 
대신

mov ecx, 4 
mov eax, [edx + ecx] 
adc eax, [ebx + ecx] 
mov [ebx + ecx], eax 

8에 같은과 (12)를 사용하는 것이 아마 더 빠릅니다하지만 것 또한

MASM 코드


_asm { 
     mov edx, summand 
     mov eax, [edx] 
     mov ebx, this 
     add eax, [ebx] 
     mov [ebx], eax

mov ecx, 4 mov eax, [edx + ecx] adc eax, [ebx + ecx] mov [ebx + ecx], eax mov ecx, 8 mov eax, [edx + ecx] adc eax, [ebx + ecx] mov [ebx + ecx], eax mov ecx, 12 mov eax, [edx + ecx] adc eax, [ebx + ecx] mov [ebx + ecx], eax }
+3

C++ 컴파일러가 당신보다 코드를 작성하는 것이 더 좋을 것 같습니다. 그것은 예상된다. 현대 컴파일러는 영웅적인 최적화를 수행합니다. 왜 더 잘할 수있을 것으로 기대합니까? 컴파일러에서 어떤 코드를 내 보냈습니까? 어떻게 다릅니 까? 당신의 타이밍에 얼마나 자신이 있습니까? –

+0

음, C++ 코드가 링크에 표시됩니다. 작업을 수행하는 데 필요한 시간은 C++ 또는 asm을 추가 할 때마다 100 % 확실합니다. – user2226676

+1

C++ 코드가 실행되지 않습니다. 컴파일러는 실행될 코드를 생성합니다. 생성 된 코드는 어떻게 생겼습니까? 그리고 어떻게 지내셨습니까? 여기에있는 많은 벤치 마크 질문은 잘못된 타이밍에 빠지기 시작합니다. –

답변

1

300 밀리 간다 asm 코드가 링크의 C++ 코드보다 실제로 느리다면 놀라실 것입니다. asm 블록을 사용하면 함수의 다른 부분에서 일부 최적화가 비활성화 될 수 있습니다. 전체 함수에 대해 생성 된 어셈블러 코드를 찾아야합니다. (그리고 당신의 700ms는 무엇입니까?)

+0

모든 추가는 모든 추가에 대해 거의 700ms가 걸립니다.이 속도는 많이 변경하지 않고 단지 몇 밀리 초입니다. – user2226676

+0

ms는 내가 올 때부터 밀리 초를 의미합니다 ... – TonyK

+0

@TonyK 컴파일러는 SIMD 추가를 위해 SSE 유닛을 사용할 수 있습니다. –

관련 문제