2011-08-31 3 views
3

나는 며칠 동안 MINGW에서 GMP 라이브러리를 설치하려고 노력 해왔다. 저는 주 단위로 __uint128_t을 gcc와 linux64 비트 환경에서 사용했고, GMP와 mingw (32 비트 버전)에서 동일한 프로그램을 이식했습니다. __uint128_t 대신 mpz_class 개의 정수를 사용했습니다. 그렇다면 새로운 프로그램을 시작하고 ...! __uint128_t과 64 비트로 완료하려면 16 분이 걸리며 GMP와 MINGW는 91 시간이 걸립니다 !!!gmp로 고정 된 크기의 정수 ...?

조금 속도를 높이려면 어떻게해야합니까? 32 비트 환경에서 128 비트 정수 수학을 수행하는 더 빠른 방법이 있습니까? 나는 128 비트 이상을 필요로하지 않으므로 GMP에게 "알았어, 단지 128 비트가 필요하고, 프리젠 테이션을 고정 시키지만 더 빨리 가라."고 말할 수있는 방법이 있습니까?

+0

128 비트에서 어떤 작업을 수행해야합니까? ('+','-','<'/'>','*','/', 더 흥미로운 것이 있습니까?) – osgx

+0

64 비트는 기본적으로 컴파일러에서 지원됩니다. 32 비트 단위를 사용하여 64 비트 산술을 수행하는 코드를 찾고 64 비트 단위를 사용하여 128 비트 단위로 구현하는 원리를 사용하십시오. 네이티브 128 비트 지원 (예 : SSE와 함께 사용 가능)보다 빠르지는 않지만 libgmp보다 빠를 것입니다. – user786653

+0

64 비트가 컴파일러에서 지원 될 수 있지만 특히 실제 64 비트 환경 (IOW, 64 비트 레지스터 및 그 이상)에서 구분 (및 모듈) 및 곱셈과 같은 작업이 훨씬 빠릅니다. –

답변

3

아니요, mpz_t을 사용하는 경우 GMP를 고정 소수점 정수로 제한 할 수 없습니다. mpz_t는 사지 배열 (할당; 사용)의 길이와 int (사지; int32 또는 int64 배열)의 배열로 저장된 실제 값에 대한 포인터가있는 구조체입니다. GMP는 커질 때 어떤 값의 길이를 확장 할 준비가되어 있습니다.

당신은 mpz_init2를 사용하여 초기화에서 모든 mpz_t 128 비트를 할당 할 수 있습니다 :

mpz_init2(mpz_t*, bit_number); 

을하지만이의 속도 향상이 작은, 여전히 데이터 간접 길이 취급있다.

당신은 mpn_ 낮은 수준의 기능으로 전환하여 사지를 직접 사용할 수 있습니다

:

http://www.gnu.org/software/gmp/manual/html_node/Low-level-Functions.html#Low-level%20Functions

(이 캐시에 좋다) 사지에는 포인터가 없을 것, 쉬운 입력/출력 코드; 자동 사지 크기 처리 (자동 확장 또는 할당 없음)가 필요하지 않습니다. 너는 너 자신에 의하여 모든 저장을해야한다; 수동으로 처리해야하는 일부 캐리 일 수도 있지만 GMP의 빠른 *, /% 작업이있을 것입니다. mpz_t t;t._mp_size = t._mp_alloc=limb_number;t._mp_d=pointer_to_limb_array으로 쉬운 입/출력을 위해 mpz_t를 재구성 할 수 있습니다.

또한 64 비트 윙으로 전환하면 uint128_t를 사용할 수 있습니다.

+0

그리고 mpz_init2를 사용하고 128 비트를 할당하면 속도가 빨라집니다. ..? –

+0

@Matteo 그는 "그러나 이것으로부터의 속도는 작다"고 말했다. –

+0

@Seth (감사합니다.하지만 그는 대답을 편집했습니다! : D 나는 전에 그것을 보지 못했습니다!) –

1

타겟팅하려는 Windows 컴퓨터가 64 비트 Windows (예 : Vista 또는 7)를 탑재 할 수있는 새 컴퓨터 인 경우 MinGW-w64을 대신 사용할 수 있습니다.