2016-06-10 4 views
0

Ich möchte die Größe der Integer-Funktion IDAMAX in jeder BLAS Fortran-Bibliothek bestimmen. Es kann entweder 4-Byte (i32lp64-Modell) oder 8-Byte (ilp64) sein.Gibt es eine Möglichkeit, die Größe der BLAS IDAMAX-Funktion zu bestimmen?

Wenn Sie diese Größe kennen, können Sie bestimmen, welche Gesamt-Integer-Deklaration (Ganzzahl * 4 oder Ganzzahl * 8) in einer vorgefertigten BLAS-Bibliothek enthalten ist.

Das Problem ist, dass sizeof (* idamax_ (& n, dx, & INCX)) das Programm unter immer 4 zurückkehrt, wenn I 8 mit MKL-integer * 8 blas erwarten würde.

Irgendwelche Kommentare, bitte?

#include <stdio.h> 
void main() { 
extern * idamax_(); // external Fortran BLAS function IDAMAX 
int n=2; int incx=1; 
//long n=2; long incx=1; 
double dx[2]; dx[0]=1.0; dx[1]=2.0; 
printf("sizeof(n)=%i\n",sizeof(n)); 
printf("sizeof(*idamax_(&n, dx, &incx))=%i\n",sizeof(*idamax_(&n, dx,&incx))); // still returns four !!! 
//printf("sizeof(idamax_(&n, dx, &incx))=%i\n",sizeof(idamax_(&n, dx, &incx))); 
// idamax call sometimes crashes with wrong integer sizes - with MKL, but with GNU ibblas.a ! The same with Fortran 
idamax_(&n, dx, &incx); 
} 
+0

Wie kompilieren und verknüpfen Sie Ihren Code für den Fall 'MKL-integer * 8 blas'? – kangshiyin

+0

Hi Eric, für MKL-i8: icc -g sizeof_idamax.c-Wl, - start-group /cvmfs/it.gsi.de/compiler/intel/15.0/composer_xe_2015.2.164/mkl/lib/intel64/libmkl_lapack95_ilp64. a -lmkl_intel_ilp64 -openmp -Wl, - Endgruppe -Wl, - start-group -lmkl_intel_ilp64 -lmkl_intel_thread -lmkl_core -lpthread /usr/lib/x86_64-linux-gnu/libm.so -openmp -Wl, - Endgruppe; Auf der Intel-Webseite gibt es eine Formel, um die richtigen MKL Link-Flags zu erhalten. –

+0

Es scheint, dass der Standardwert extern * idamax_(); // externe Fortran BLAS Funktion IDAMAX ist immer int (integer * 4), obwohl ich es nicht deklariert habe. Ich dachte, dass die "sizeof (idamax _ (& n, dx, >> & incx)));" wird zur Laufzeit bestimmt, abhängig vom Integer * 4/8-Modell der Linked-Blas-Bibliothek. –

Antwort

0

Ihr Code wird jede Funktion in jeder BLAS Fortran Bibliothek nicht bestimmen. Es ist eine Funktion deklariert, indem Sie sich mit

extern * idamax_(); 

Bestimmen Sie nicht den Rückgabetyp dieser Funktion angegeben haben, dann ist es standardmäßig int, mit einer konstanten Größe von 4 auf den meisten Maschinen.

Wenn Sie den Rückgabetyp von MKL BLAS-Funktion bestimmen möchten, ist das einzige, was Sie tun müssen, überprüfen Sie die Header-Datei. In ${MKL_ROOT}/include/mkl_blas.h können Sie

MKL_INT IDAMAX(const MKL_INT *n, const double *x, const MKL_INT *incx); 

Der Rückgabetyp finden MKL_INT ist, und die Größe ist sizeof(MKL_INT), die auf der Kompilierung bestimmt wird. Sie können sich auf etwas Ähnliches wie dies in ${MKL_ROOT}/include/mkl_types.h

#ifdef MKL_ILP64 
    #ifndef MKL_INT 
    #define MKL_INT MKL_INT64 
    #endif 
#else 
    #ifndef MKL_INT 
    #define MKL_INT int 
    #endif 
#endif 

So ist die Größe von MKL_INT hängt nur, ob Sie MKL_ILP64 oder nicht an der Kompilierung definieren.

+0

Danke für die Antwort, Eric, so hat die MKL-Bibliothek gut definierte Schnittstelle in Bezug auf die Integer-Größe. Aber wie wäre es mit der GNU Blas Bibliothek, libblas.a? In diesem Fall, wenn ich Integer * 4 idamax mit ganzzahligen * 8 Parametern n, incx aufruft, gibt es keinen Absturz wie beim analogen MKL-blas, und idamax liefert ein gutes Ergebnis. Es wäre gut, den ganzzahligen "Status" irgendeiner Blasbibliothek durch ein kleines Testprogramm zu erkennen. –

+0

@ MiroIliaš der Schlüsselpunkt ist, dass Sie die offizielle Header-Datei von GNU blas lib finden und überprüfen, wie es die APIs deklariert. Kein Absturz bedeutet wahrscheinlich Glück oder der comipler hat int64 automatisch in int32 umgewandelt, bevor er die Funktion aufgerufen hat. – kangshiyin

+0

Hallo, diese Fortran-API ist eine einfache ganzzahlige Rückgabe-Funktion, "Integer-Funktion idamax (n, dx, incx)" (Teil von blas).Ich hoffte, 4/8-Bytes der zurückkehrenden Ganzzahl zu unterscheiden, aber es wird immer Größe 4 zurückgegeben - der Standard-Int. –