有没有办法确定BLAS IDAMAX函数的大小?

时间:2016-06-10 23:11:29

标签: integer blas

我想确定任何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);
}

1 个答案:

答案 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