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);
}
Wie kompilieren und verknüpfen Sie Ihren Code für den Fall 'MKL-integer * 8 blas'? – kangshiyin
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. –
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. –