Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parallel processing 使用scalapack的线性系统的结果随处理器数量的变化而变化_Parallel Processing_Mpi_Scalapack - Fatal编程技术网

Parallel processing 使用scalapack的线性系统的结果随处理器数量的变化而变化

Parallel processing 使用scalapack的线性系统的结果随处理器数量的变化而变化,parallel-processing,mpi,scalapack,Parallel Processing,Mpi,Scalapack,我用的是,并试图求解A*X=B,但我的结果随着处理器数量的变化而变化。在这方面谁能帮我一下吗 ! 使用MPI-IO循环读取对角矩阵分布块, ! 使用Scalapack求解ax=b。 ! 程序数组 使用mpi 隐式无 整数,参数::mk=SELECTED\u REAL\u kind15307 整数::N,Nb ! 问题大小和块大小 整数::myArows、myAcols、myBcols ! 全局数组的局部子集的大小 REALmk,维度:,可分配::myA,myB 整数,维度:,可分配::ipiv

我用的是,并试图求解A*X=B,但我的结果随着处理器数量的变化而变化。在这方面谁能帮我一下吗

! 使用MPI-IO循环读取对角矩阵分布块, ! 使用Scalapack求解ax=b。 ! 程序数组 使用mpi 隐式无 整数,参数::mk=SELECTED\u REAL\u kind15307 整数::N,Nb ! 问题大小和块大小 整数::myArows、myAcols、myBcols ! 全局数组的局部子集的大小 REALmk,维度:,可分配::myA,myB 整数,维度:,可分配::ipiv 整数,外部::numroc ! blacs例行程序 整数::me、nprocs、ictxt、prow、pcol、myrow、mycol ! blacs数据 整数::信息 ! scalapack返回值 整数,维数9::desca,descb ! scalapack数组描述 整数:时钟 REALmk::calctime,iotime CHARACTERLEN=128::matsize、fnamea、fnameb 整数::myrank 整数::ierr 整数,维度2::pdims,dims,distribs,dargs 整数::infle 整数,维度MPI\U状态\U大小::MPI状态 整数::darraya,darrayb !新数据类型句柄 整数::locsizea,nelementsa 整数::locsizeb、nelementsb、nelementsw INTEGERKIND=MPI\u地址\u种类::lba,locextenta INTEGERKIND=MPI\u地址\u种类::lbb,locextentb !整数种类=MPI\U偏移量\U种类::disp 整数::纳格斯 整数::m,IPACPY,ipa 整数::mpik !实类精度 调用MPI_Initierr 请致电MPI_Comm_sizeMPI_Comm_WORLD、NPROC、ierr 请致电MPI_Comm_rankMPI_Comm_WORLD、myrank、ierr ! 为MPI-IO初始化MPI pdims=0 调用MPI_Dims_createnprocs,2,pdims,ierr 船首=pdims1 pcol=pdims2 !从MPI_Dims_create获取流程网格 nargs=命令\参数\计数 如果nargs/=3,则 打印*,“用法:mpirun-np np./a.out N文件名a文件名b” 打印*,“其中np是处理器的数量” 打印*,'其中N是矩阵A的大小' 打印*,“其中filenamea=矩阵文件数据的名称。” 打印*,'其中filenameb=B矩阵文件数据的名称。' 调用MPI_AbortMPI_COMM_WORLD,1,ierr 恩迪夫 调用get_命令_argument1,matsize 调用get_命令_argument2,fnamea 调用get_命令_argument3,fnameb ! 获取文件名 READmatsize1:LEN_Trimmatize,*N !我们将使用的数组的大小 选择案例mk 案例选择_REAL_KIND6,37 mpik=MPI\u实 案例选择_REAL_kind15307 mpik=MPI\u双精度 案例违约 打印*,未定义输入数据类型! 调用MPI_AbortMPI_COMM_WORLD,1,ierr 结束选择 Nb=64 !大矩阵32或64的块大小是合适的选择 如果Nb>N/prow Nb=N/prow 如果Nb>N/pcol Nb=N/pcol dims=[N,N] distribs=[MPI\u DISTRIBUTE\u Cycle,MPI\u DISTRIBUTE\u Cycle] 黑色=[Nb,Nb] 调用MPI_Type_create_darraynprocs、myrank、2、dims、distribs、dargs、& &pdims、MPI_ORDER_FORTRAN、mpik、darraya、ierr !创建分布式阵列数据类型 请致电MPI_Type_Commitdaraya,ierr 调用MPI_Type_sizedaraya、locsizea、ierr nelementsa=locsizea/mk 调用MPI_Type_get_extentdaraya、lba、locextenta、ierr dims=[N,1] 黑色=[Nb,1] 调用MPI_Type_create_darraynprocs、myrank、2、dims、distribs、dargs、& &pdims、MPI_ORDER_FORTRAN、mpik、darrayb、ierr !创建分布式阵列数据类型 调用MPI_Type_commitdarayb,ierr 调用MPI_Type_sizedarayb、locsizeb、ierr nelementsb=locsizeb/mk 调用MPI\u Type\u get\u extendArrayB、lbb、locextendTB、ierr 分配元素A allocatemnelementsb ! 初始化本地数组 调用MPI_文件\u openMPI_通信世界、TRIMfnamea、MPI_模式\r仅、& &MPI\u信息\u空,填充,ierr 调用MPI\u File\u read\u allinfile、myA、nelementsa、mpik、mpistatus、ierr 调用MPI\u文件\u closeinfle,ierr ! 读入数据 调用MPI_文件\u openMPI_通信世界、TRIMfnameb、MPI_模式\r仅、& &MPI\u信息\u空,填充,ierr 调用MPI\u File\u read\u allinfile、myB、nelementsb、mpik、mpistatus、ierr 调用MPI\u文件\u closeinfle,ierr ! 读入数据 iotime=tockclock 如果myrank==0,则 打印*,'I/O时间=',iotime 恩迪夫 ! 初始化blacs处理器网格 呼叫滴答声 打电话给blacs_pinfome,NPROC 呼叫blacs_get-1,0,ictxt 调用blacs_gridinitictxt,'R',prow,pcol 调用blacs_gridinfoictxt、prow、pcol、myrow、mycol myArows=numrocN,Nb,myrow,0,船头 myAcols=numrocN,Nb,mycol,0,pcol myBcols=numroc1,Nb,mycol,0,pcol !NUMROC计算分布式数据库的行数或列数 !由第三个输入指示的流程拥有的矩阵。 !第四个输入元素是具有 !分布式矩阵的第一行或第一列 ! 构造本地数组 ! 全局结构:n行n列的矩阵A 调用descinitdesca,N,N,Nb,Nb,0,0,ictxt,max1,myArows,info 调用descinitdescb,N,1,Nb,1,0,0,ictxt,max1,myArows,info ! 为ScaLAPACK准备数组描述符 nelementsw=descb9*myBcols AllocateIpivElementSW !卡尔 L SCALAPACK例程 !求解线性系统A*X=B 选择案例mk 案例选择_REAL_KIND6,37 呼叫PSGESVN,1,myA,1,1,desca,ipiv,myB,1,1,descb,info 案例选择_REAL_kind15307 请致电PDGESVN,1,myA,1,1,desca,ipiv,myB,1,1,descb,info 结束选择 如果info/=0,则 打印*,myrank,'Error-info=',info 调用MPI_AbortMPI_COMM_WORLD,1,ierr 恩迪夫 WRITEfnameb,'Asol.dat' 调用PDLAWRITEtrimfnameb,N,1,myB,1,1,DESCB,0,0,ipiv !调用MPI_文件\u openMPI_通信世界、TRIMfnameb、MPI_模式\u创建+& !& MPI_模式仅限编写,MPI_信息为空,填充,ierr !调用MPI\u File\u write\u allinfile、myB、nelementsb、mpik、mpistatus、ierr !调用MPI\u文件\u closeinfle,ierr ! 取消分配本地阵列 解除分配MyA、ipiv、myB ! 所用处理器的结束blac 调用blacs_gridexitictxt 计算时间=tockclock ! 打印结果 如果me==0,则 如果info/=0,则 打印*,“错误-信息=”,信息 恩迪夫 打印*,“计算时间=”,计算时间 恩迪夫 调用MPI_finalizer 包含 子程序滴答 整数,输出::t 呼叫系统 结束子程序勾号 ! 以秒为单位返回从现在到t描述的时间 函数tockt 整数,INTENTIN::t REALmk::tock 整数::现在,时钟频率 呼叫系统时钟现在,时钟频率 tock=REALnow-t,mk/REALclock\u速率,mk 端函数tock 终端程序阵列 矩阵A和B是scalapack示例。只是用二进制格式重写了它们。因此,上述程序可以使用它们

 19.0  3.0  1.0  12.0  1.0  16.0  1.0  3.0  11.0 
-19.0  3.0  1.0  12.0  1.0  16.0  1.0  3.0  11.0
-19.0 -3.0  1.0  12.0  1.0  16.0  1.0  3.0  11.0 
-19.0 -3.0 -1.0  12.0  1.0  16.0  1.0  3.0  11.0 
-19.0 -3.0 -1.0 -12.0  1.0  16.0  1.0  3.0  11.0 
-19.0 -3.0 -1.0 -12.0 -1.0  16.0  1.0  3.0  11.0 
-19.0 -3.0 -1.0 -12.0 -1.0 -16.0  1.0  3.0  11.0 
-19.0 -3.0 -1.0 -12.0 -1.0 -16.0 -1.0  3.0  11.0
-19.0 -3.0 -1.0 -12.0 -1.0 -16.0 -1.0 -3.0  11.0
B

例如,对于一个处理器:

mpirun-np 1./array 9 A.dat B.dat

           9           1
      0.000000000000000000D+00
     -0.166666666666666657D+00
      0.500000000000000000D+00
      0.000000000000000000D+00
      0.000000000000000000D+00
      0.000000000000000000D+00
      0.000000000000000000D+00
      0.000000000000000000D+00
      0.000000000000000000D+00
           0 Error -- info =            3
           1 Error -- info =            3
           2 Error -- info =            3
           3 Error -- info =            3
           4 Error -- info =            3
           5 Error -- info =            3
和2个处理器

           9           1
     -0.432625129877109577D-01
     -0.000000000000000000D+00
     -0.677331518039483299D-01
     -0.250000000000000000D+00
      0.250000000000000056D+00
      0.769230769230769273D-01
      0.117743386633788305D+00
      0.122377622377622383D+00
      0.157721108027438911D+00
对于6个处理器,我会收到一个错误

mpirun-np 6./a.out 9 a.dat B.dat

           9           1
      0.000000000000000000D+00
     -0.166666666666666657D+00
      0.500000000000000000D+00
      0.000000000000000000D+00
      0.000000000000000000D+00
      0.000000000000000000D+00
      0.000000000000000000D+00
      0.000000000000000000D+00
      0.000000000000000000D+00
           0 Error -- info =            3
           1 Error -- info =            3
           2 Error -- info =            3
           3 Error -- info =            3
           4 Error -- info =            3
           5 Error -- info =            3
使用scalapack示例时不会出现这种情况

问题解决了

首先,我在打开文件后修复了文件中数据的进程视图

CALL MPI_File_set_view(infile,0_MPI_OFFSET_KIND,mpik,darraya,"native",MPI_INFO_NULL,ierr)
其次,我通过更改

CALL descinit(descb,N,1,Nb, 1,0,0,ictxt,max(1,myArows),info)


这些更改是我遗漏的问题的一部分。

我已经将结果添加到了那里。