LAPACK C(mkl)dptsv行主要/列专业:它对矢量有影响吗?

时间:2015-03-09 16:59:12

标签: lapack hpc scientific-computing intel-mkl

伙计们,我打电话给LAPACKE_dptsv

如果所有参数都是1d数组,那么调用数据LAPACK_ROW_MAJORLAPACK_COL_MAJOR是否重要?

1 个答案:

答案 0 :(得分:1)

函数LAPACKE_dptsv()对应于lapack函数dptsv(),它不具有LAPACK_ROW_MAJORLAPACK_COL_MAJOR之间的切换功能。 dptsv()用于列主要排序corresponding to matrices in Fortran,而大多数C矩阵都是行主要排序。因此LAPACKE_dptsv(LAPACK_ROW_MAJOR,...)执行以下步骤:

  • 转置右端b
  • 致电Lapack的dptsv()
  • 转置回复(再次b

您可以在/lapacke/src/lapacke_dptsv_work.c中的Lapacke来源中查看此内容。

还有一个问题: *它是否在很大程度上影响了挂钟时间? * 查看dpttrs_8f_source可能:分解L*D*L**T由单个for循环执行(+循环展开)。因此,有必要使用一段代码来回答这个问题。以下代码由gcc main.c -o main -llapacke -llapack -lblas

编译
#include <stdio.h>
#include "lapacke.h"
#include <malloc.h>
#include <time.h>

int main ()
{
    //double a[3][2] = {{1,0},{1,1},{1,2}};

    double **outputArray;
    int designs=3;
    int i,j;
    lapack_int info,n,ldb,nrhs;

    n = 420000;
    nrhs = 42;

    //double outputArray[3][1] = {{6},{0},{0}};
    double* ad=malloc(n*sizeof(double));
    if(ad==NULL){printf("malloc failed\n");exit(1);}
    for(i=0;i<n;i++){
        ad[i]=3;
    }
    double* ae=malloc((n-1)*sizeof(double));
    if(ae==NULL){printf("malloc failed\n");exit(1);}
    for(i=0;i<n-1;i++){
        ae[i]=-1;
    }

    double* b=malloc(n*nrhs* sizeof(double));
    if(b==NULL){printf("malloc failed\n");exit(1);}

    for(j=0;j<nrhs;j++){
        for(i=0;i<n;i++){
            b[i*nrhs+j]=i+2*j;
        }
    }

    ldb=nrhs;

    clock_t t;
    t = clock();
    info = LAPACKE_dptsv(LAPACK_ROW_MAJOR,n,nrhs,ad,ae,b,ldb);
    if(info!=0){printf("failed, info %d\n",info);}
    t = clock() - t;
    printf ("LAPACK_ROW_MAJOR :  %d clicks (%f seconds).\n",t,((float)t)/CLOCKS_PER_SEC);

    for(i=0;i<n;i++){
        ad[i]=3;
    }
    if(ae==NULL){printf("malloc failed\n");exit(1);}
    for(i=0;i<n-1;i++){
        ae[i]=-1;
    }

    double* b2=malloc(n*nrhs* sizeof(double));
    if(b2==NULL){printf("malloc failed\n");exit(1);}
    for(j=0;j<nrhs;j++){
        for(i=0;i<n;i++){
            b2[j*n+i]=i+2*j;
        }
    }

    t = clock();
    ldb=n;
    info = LAPACKE_dptsv(LAPACK_COL_MAJOR,n,nrhs,ad,ae,b2,ldb);
    if(info!=0){printf("failed, info %d\n",info);}
    t = clock() - t;
    printf ("LAPACK_COL_MAJOR :  %d clicks (%f seconds).\n",t,((float)t)/CLOCKS_PER_SEC);

    double delta=0,temp,deltal=0;
    for(i=0;i<n;i++){
        deltal=0;
        for(j=0;j<nrhs;j++){
            temp=(b[i*nrhs+j]-b2[j*n+i]);
            deltal+=temp*temp;
        }
        delta+=deltal;
    }
    printf("delta %g\n",delta);
    free(ad);
    free(ae);
    free(b);
    free(b2);
    return (info);
} 

我的输出是:

  

LAPACK_ROW_MAJOR:770000次点击(0.770000秒)。

     

LAPACK_COL_MAJOR:310000次点击(0.310000秒)。

所以LAPACKE_dptsv()使用LAPACK_COL_MAJOR快速运行两倍,其中`nbrhs = 42

如果rhs的数量减少到一个(n更大)

  

LAPACK_ROW_MAJOR:250000次点击(0.250000秒)。

     

LAPACK_COL_MAJOR:180000次点击(0.180000秒)。

LAPACK_COL_MAJORLAPACK_ROW_MAJOR与单个RHS的挂钟时间大致相同。输出也一样。

我没有在我的电脑上安装intel mkl,我很好奇它改变测试结束的方式......

相关问题