Problems when tuning GMP under MinGW

Basil Peace grv87-dev at
Fri Jun 7 08:30:32 CEST 2013

Good time of day!


I try to compile and tune GMP 5.1 trunk version from repository (revision


I build against MinGW32 (latest standard version with MSYS) with the
following configuration options:


./configure PREFIX=/v/gmp/mingw32/static --build=k8-pc-mingw32
--disable-shared --enable-static --disable-fat --enable-cxx
--enable-assembly --enable-fft --disable-assert CPPFLAGS=-fexceptions



$ gcc -v

Используются внутренние спецификации.



Целевая архитектура: mingw32

Параметры конфигурации: ../gcc-4.7.2/configure
--enable-languages=c,c++,ada,fortran,objc,obj-c++ --disable-sjlj-exceptions

h-dwarf2 --enable-shared --enable-libgomp --disable-win32-registry
--enable-libstdcxx-debug --disable-build-poststage1-with-cxx

--enable-version-specific-runtime-libs --build=mingw32 --prefix=/mingw

Модель многопоточности: win32

gcc версия 4.7.2 (GCC)


Output from 'uname -a':

$ uname -a

MINGW32_NT-6.1 DEVELOPMENTVM 1.0.18(0.48/3/2) 2012-11-21 22:34 i686 Msys


Output from ./config.guess and ./configfsf.guess:

Developer at DevelopmentVM /s/gnu/lib/gmp/5.1.devel

$ ./config.guess



Developer at DevelopmentVM /s/gnu/lib/gmp/5.1.devel

$ ./configfsf.guess



I experience the following problems while tuning GMP:



1. I've noted an misstatement in documentation (file doc/gmp.texi), section
"Performance optimization". 'make tuneup' doesn't work.


Developer at DevelopmentVM /s/gnu/lib/gmp/5.1.devel/tune

$ make tuneup

gcc -std=gnu99 -m32 -O2 -pedantic -fomit-frame-pointer -mtune=k8 -march=k8
-fexceptions   tuneup.c   -o tuneup

tuneup.c:103:20: fatal error: config.h: No such file or directory

compilation terminated.

make: *** [tuneup] Error 1


tune/README states that command for making tuneup program is 'make tune',
not 'make tuneup'.



2. Errors while making tuneup programs:


/bin/sh ../libtool --tag=CC   --mode=compile gcc -std=gnu99 -DHAVE_CONFIG_H
-I. -I.. -I.. -I../tests  -fexceptions  -m32 -O2 -pe

dantic -fomit-frame-pointer -mtune=k8 -march=k8 -c -o time.lo time.c

libtool: compile:  gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I.. -I.. -I../tests
-fexceptions -m32 -O2 -pedantic -fomit-frame-pointer

-mtune=k8 -march=k8 -c time.c -o time.o

time.c: In function 'getrusage_backwards_p':

time.c:664:18: error: storage size of 'start' isn't known

time.c:664:25: error: storage size of 'prev' isn't known

time.c:664:31: error: storage size of 'next' isn't known

time.c: In function 'cgt_works_p':

time.c:773:23: error: storage size of 'start' isn't known

time.c:773:30: error: storage size of 'end' isn't known

make[1]: *** [time.lo] Error 1

make[1]: Leaving directory `/s/gnu/lib/gmp/5.1.devel/tune'

make: *** [tune] Error 2


I don't sure but it seems for me that these are simply typos. Looking at
macros, I suppose these lines should be:


struct_rusage  start, prev, next;

and 773:

struct_timespec start, end;


I've made these corrections in source and successfully compiled tuneup.


3. Tuneup crashes with the following output:


Parameters for ./mpn/x86/k8/gmp-mparam.h

Системе не удается найти указанный путь.

Системе не удается найти указанный путь.

Системе не удается найти указанный путь.

Using: CPU cycle counter

speed_precision 10000, speed_unittime 1 cycle, CPU freq unknown

DEFAULT_MAX_SIZE 1000, fft_max_size 50000


/* Generated by tuneup.c, 2013-06-07, gcc 4.7 */


#define MOD_1_NORM_THRESHOLD                 0  /* always */

#define MOD_1_UNNORM_THRESHOLD               0  /* always */

#define MOD_1N_TO_MOD_1_1_THRESHOLD          2

#define MOD_1U_TO_MOD_1_1_THRESHOLD          4

#define MOD_1_1_TO_MOD_1_2_THRESHOLD        45

#define MOD_1_2_TO_MOD_1_4_THRESHOLD     MP_SIZE_T_MAX

#define PREINV_MOD_1_TO_MOD_1_THRESHOLD     47

#define USE_PREINV_DIVREM_1                  1  /* native */

#define DIV_QR_2_PI2_THRESHOLD           MP_SIZE_T_MAX  /* never */

#define DIVEXACT_1_THRESHOLD                 0  /* always (native) */

#define BMOD_1_TO_MOD_1_THRESHOLD        MP_SIZE_T_MAX  /* never */


#define MUL_TOOM22_THRESHOLD                30

#define MUL_TOOM33_THRESHOLD                56

#define MUL_TOOM44_THRESHOLD                63

#define MUL_TOOM6H_THRESHOLD               226

#define MUL_TOOM8H_THRESHOLD               296


#define MUL_TOOM32_TO_TOOM43_THRESHOLD      81

#define MUL_TOOM32_TO_TOOM53_THRESHOLD      75

#define MUL_TOOM42_TO_TOOM53_THRESHOLD      81

#define MUL_TOOM42_TO_TOOM63_THRESHOLD      92

#define MUL_TOOM43_TO_TOOM54_THRESHOLD     121


#define SQR_BASECASE_THRESHOLD               0  /* always (native) */

#define SQR_TOOM2_THRESHOLD                 50

#define SQR_TOOM3_THRESHOLD                 84

#define SQR_TOOM4_THRESHOLD                202

#define SQR_TOOM6_THRESHOLD                309

#define SQR_TOOM8_THRESHOLD                406


#define MULMID_TOOM42_THRESHOLD             74


#define MULMOD_BNM1_THRESHOLD               19

#define SQRMOD_BNM1_THRESHOLD               21


#define MUL_FFT_MODF_THRESHOLD             492  /* k = 5 */

#define MUL_FFT_TABLE3                                      \

  { {    492, 5}, {    104, 8}../mpn/generic/mul_fft.c:459: GNU MP assertion
failed: nprime2 < n


This application has requested the Runtime to terminate it in an unusual

Please contact the application's support team for more information.

make: *** [tune] Error 3


1) Actual path is ../mpn/x86/k8/gmp-mparam.h.

2) Tuneup crashed and was terminated by Windows.



4. At the last, I can't build tuneup against shared libraries (MinGW doesn't
allow to build shared and static libraries at the same time). I think that
it should be noted somewhere in documentation.



I hope I've done everything well, and my report will be useful.



Best regards,

Basil Peace

More information about the gmp-bugs mailing list