我想确定任何BLAS Fortran库中整数函数IDAMAX的大小。它可以是4字节(i32lp64型号)或8字节(ilp64)。
知道这个大小可以确定预构建BLAS库中的整数整数声明(整数* 4或整数* 8)。
问题是下面程序的sizeof(* idamax _(& n,dx,& incx))总是返回4,尽管我期望8使用MKL整数* 8 blas。
有任何意见吗?
#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 :(得分:0)
您的代码未确定任何BLAS Fortran库中的任何功能。它决定了你自己用
声明的函数extern * idamax_();
由于您没有指定此函数的返回类型,因此默认为int
,大多数计算机上的常量大小为4.
如果要确定MKL的BLAS功能的返回类型,您唯一需要做的就是检查头文件。在${MKL_ROOT}/include/mkl_blas.h
,您可以找到
MKL_INT IDAMAX(const MKL_INT *n, const double *x, const MKL_INT *incx);
返回类型为MKL_INT
,大小为sizeof(MKL_INT)
,这是在编译时确定的。您可以在${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
因此MKL_INT
的大小仅取决于您是否在编译时定义MKL_ILP64
。