LU 分解,採用行連續劃分方式下的 MPI 實現

2021-07-09 13:17:29 字數 1383 閱讀 5344

#include "stdio.h"

#include "stdlib.h"

#include "mpi.h"

#define a(x,y) a[x*m+y]

/*a為m*m矩陣*/

#define a(x,y) a[x*m+y]

#define l(x,y) l[x*m+y]

#define u(x,y) u[x*m+y]

#define floatsize sizeof(float)

#define intsize sizeof(int)

int m,n;

int m;

float *a;

int my_rank;

int p;

mpi_status status;

void fatal(char *message)

void environment_finalize(float *a,float *f)

int main(int argc, char **argv)

a=(float *)malloc(floatsize*m*m);

for(i = 0; i < m; i ++)

for(j = 0; j < m; j ++)

fscanf(fda, "%f", a+i*m+j);

fclose(fda);

}/*0號程序將m廣播給所有程序*/

mpi_bcast(&m,1,mpi_int,0,mpi_comm_world);

m=m/p;

if (m%p!=0) m++; //m/p向上取餘

/*分配至各程序的【子矩陣大小為m*m】*/

a=(float*)malloc(floatsize*m*m);

/*各程序為主行元素建立【傳送和接收緩衝區】*/

f=(float*)malloc(floatsize*m);

/*0號程序為l和u矩陣分配記憶體,以分離出經過變換後的a矩陣中的l和u矩陣*/

if (my_rank==0)

/*0號程序採用行交叉劃分將矩陣a劃分為大小【m*m的p塊子矩陣】,依次傳送給1至p-1號程序*/

if (a==null) fatal("allocate error\n");

if (my_rank==0)

printf("\noutput of lu operation\n");

printf("matrix l:\n");

for(i=0;iprintf("matrix u:\n");

for(i=0;i}

mpi_finalize();

environment_finalize(a,f);

return(0);

}

cusolver庫使用(LU分解)

由於網上關於使用cusolver庫的介紹比較少,今天就簡單地根據samples寫了乙個lu分解,來解決稠密矩陣ax b的例子 需要安裝cuda 首先使用vs建立工程 1.導入庫 第一步 右鍵專案 新增依賴性 生成自定義 第二步 專案屬性 鏈結器 輸入 新增三個依賴項cudart.lib,cusolv...

LU分解和轉置

我們通過消元法解出 ax b 在消元過程中,我們要把a化成上三角形式,我們稱之為 u 而 e 就是描述 a 與 u 關係的矩陣,我們有 ea u 這是之前學過的內容,再熟悉不過了,但是我們的行交換矩陣 e 並不是乙個漂亮的形式,為啥這麼說呢!看個例幾 a left begin 2 4 2 4 10 ...

c 矩陣求逆的lu分解實現

c 矩陣求逆的lu分解實現 初學c 嘗試利用基礎知識編寫矩陣求逆。但發現求解伴隨陣的過程非常複雜且難以實現,而我正好看到一篇求三角陣伴隨矩陣的文章,故嘗試程式設計實現。在這種方法下,計算量明顯減小,實現方法,思路適合初學者。參考文獻 三角形矩陣求伴隨矩陣的一種方法 曾月新 求逆矩陣思路 1.求矩陣的...