Linux系统下C语言如何调用scalapack中的函数

在并行计算中经常需要调用scalapck(并行化的lapack)函数库里面的函数进行编程,这里简单介绍在C语言如何调用scalapck中的矩阵向量乘的函数。

注意:scalapack中的函数是用fortran写的,矩阵是按列进行存储的。

scalapack的链接需要用到blas,因此确保本机上安装好了blas、gfortran

下面是一个矩阵向量乘法的例子(为了简单计算,该程序中设定进程数为4):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mpi.h"
#define AA(i,j) AA[(i)*M+(j)]
int main(int argc, char **argv)
{
   int i, j, k;
/************  MPI ***************************/
   int myrank_mpi, nprocs_mpi;
   MPI_Init( &argc, &argv);
   MPI_Comm_rank(MPI_COMM_WORLD, &myrank_mpi);
   MPI_Comm_size(MPI_COMM_WORLD, &nprocs_mpi);
/************  BLACS ***************************/
   int ictxt, nprow, npcol, myrow, mycol,nb;
   int info,itemp;
   int ZERO=0,ONE=1;
   nprow = 2;
   npcol = 2;
   nb = 1;
   Cblacs_pinfo( &myrank_mpi, &nprocs_mpi ) ;
   Cblacs_get( -1, 0, &ictxt );
   Cblacs_gridinit( &ictxt, "Row", nprow, npcol );
   Cblacs_gridinfo( ictxt, &nprow, &npcol, &myrow, &mycol );
   int M = 4;

   int descA[9],descx[9],descy[9];
   int mA = numroc_( &M, &nb, &myrow, &ZERO, &nprow );
   int nA = numroc_( &M, &nb, &mycol, &ZERO, &npcol );
   int nx = numroc_( &M, &nb, &myrow, &ZERO, &nprow );
   int my = numroc_( &M, &nb, &myrow, &ZERO, &nprow );
   descinit_(descA, &M, &M, &nb,  &nb,  &ZERO, &ZERO, &ictxt, &mA,  &info);
   descinit_(descx, &M, &ONE,  &nb, &ONE,  &ZERO, &ZERO, &ictxt, &nx, &info);
   descinit_(descy, &M, &ONE,   &nb, &ONE,  &ZERO, &ZERO, &ictxt, &my, &info);

   double *x = (double*) malloc(nx*sizeof(double));
   double *y = (double*) calloc(my,sizeof(double));
   double *A = (double*) malloc(mA*nA*sizeof(double));
   int sat,sut;
   for(i=0;i<mA;i++)
      for(j=0;j<nA;j++)
        A[j*mA+i]=1.0;
   for(i=0;i<nx;i++)
       x[i] = 1.0;
   double alpha = 1.0; double beta = 0.0;
   pdgemv_("N", &M, &M, &alpha, A, &ONE, &ONE, descA, x, &ONE, &ONE,descx, &ONE, &beta, y, &ONE, &ONE, descy, &ONE);

   for(i=0;i<my;i++)
   printf("rank=%d ,%f \n", myrank_mpi,y[i]);
   MPI_Finalize();
   return 0;
}    

编译生成可执行文件:

mpicc -o pdgemv pdgemv.c -L/opt/scalapack/scalapck-2.0.2/ -lscalapack -lblas -lgfortran

运行:

mpirun -np 4 ./pdgemv
时间: 2024-10-17 12:09:25

Linux系统下C语言如何调用scalapack中的函数的相关文章

linux系统下C语言调用lapack ,blas库

在利用C语言编程,经常调用其他的软件包,其中lapack,blas库是最常用的两个库,这里讲下在linux系统下,C语言编程如何调用这两个库: 1.首先讲下blas库的调用,这里以两个向量内积函数为例: #include <stdio.h> #include <math.h> double ddot_(int *,double *,int *,double *,int *); int main() { int N=2, INCX=1, INCY=1; double X[2]={1.

LINUX下C语言编程调用其他函数、链接头文件以及库文件

LINUX下C语言编程经常需要链接其他函数,而其他函数一般都放在另外.c文件中,或者打包放在一个库文件里面,我需要在main函数中调用这些函数,主要有如下几种方法: 1.当需要调用函数的个数比较少时,可以直接在main函数中包含该文件,比如一个文件夹下包含add.c和main.c文件: 方法一: 文件add.c定义两个整数相加的函数,code如下: #include <stdio.h> #include <math.h> int add(int a,int b) { int z;

LINUX系统下Java和Scala的环境配置

LINUX系统下Java和Scala的环境配置 最近,笔者在研究一个有关“自然语言处理”的项目,在这个项目中,需要我们用Spark进行编程.而Spark内核是由Scala语言开发的,所以在使用Spark之前,我们必须配置好Scala,而Scala又是运行在JVM上的,所以在配置Scala之前,先要配置好JDK.下面是我个人的一些总结. 我是在Win7系统下开的虚拟机,虚拟机的系统是CentOS7,在创建虚拟机完成后,它会自带一个OpenJDK,我的版本是这样的: 但是因为最开始不了解这个情况,所

64位linux系统下编译int32_t

在64位Linux系统下编译执行一下程序输出结果为 40 8 #include <stdio.h> #include <stdlib.h> #include <stdint.h> void print_size(int32_t array[10]){ printf("%ld\n",sizeof(array)); } int main() { int32_t myarray[10]; printf("%ld\n",sizeof(my

Linux系统下吉林快-三平台开发环境搭建以及关于变量的基本操作

有问题联系Q1446595067吉林快-三平台开发, 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议.Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进. Python具有丰富和强大的库.它常被昵称为胶水语言,能够把用其他语言制作的各种模块(

linux系统下,11款常见远程桌面控制软件

linux系统下,11款常见远程桌面控制软件 一. Grdc 它是一个用GTK+编写的,适用于gnome桌面环境的远程桌面访问软件.看图: 常见功能: 1.提供全屏,窗口化的远程控制.支持高分辨率下的窗口显示以及调整. 2.可浮动的工具栏 3.可抓取键盘 4.支持建立一个“常用访问列表” 5.连接快速,高效 6.全屏模式下,当鼠标划过屏幕边缘时自动滚动 7.全屏模式下工具栏同样支持浮动效果,可直接进行例如模式切换,键盘抓取最小化等常见操作. 8. rdesktop 支持RDP协议, 9. 支持

Linux系统下基本命令

<Linux系统下基本命令> Linux系统下基本命令: 要区分大小写 uname 显示版本信息(同win2K的 ver) dir 显示当前目录文件,ls -al 显示包括隐藏文件(同win2K的 dir) pwd 查询当前所在的目录位置 cd cd ..回到上一层目录,注意cd 与..之间有空格.cd /返回到根目录. cat 文件名 查看文件内容 cat >abc.txt 往abc.txt文件中写上内容. more 文件名 以一页一页的方式显示一个文本文件. cp 复制文件 mv 移

Linux系统下用户与组的管理

Linux系统下用户与组的管理 一.用户及组基本概述 Linux 系统上,用户管理是基于用户名和密码的方式进行资源的分配. 1.uid(用户身份标识) (1)root用户 uid为0 (2)普通用户:1--65535 系统用户 系统已经已经存在专门用来对系统服务或者系统资源进行管理的 1--499(CentOS 6.X) 1--999 (CentOS 7.X) 登录用户(平时专门做系统管理的用户) 500+ (CentOS 6.X) 1000+ (CeentOS 7.X) 2.gid(用户组身份

Linux系统下目录文件配置

刚刚接触Linux,对于Linux系统下的目录配置进行了一些研究,为了避免以后误操作这些目录,建议大家还是记忆一下相关的配置! 总结 Linux 根目录主要配置 目录 文件配置内容 /bin 单用户维护模式下还能被操作的命令 /boot 开机会使用到的文件,包括Linux内核文件以及开机菜单与开机所需配置文件 /dev 设备以及设备接口文件,访问该目录下文件相当于访问某设备 - /dev下的重要文件:/dev/null,/dev/zero,/dev/tty /etc 系统主要的配置文件,比如账号