国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MPI實(shí)現(xiàn)矩陣向量乘法

這篇具有很好參考價(jià)值的文章主要介紹了MPI實(shí)現(xiàn)矩陣向量乘法。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

(1)問題

MPI實(shí)現(xiàn)矩陣向量:Ab的乘積。其中A:100行100列,b為列向量。

(2)思路

將所有進(jìn)程分為兩部分,rank=0的進(jìn)程為master節(jié)點(diǎn),其余進(jìn)程為worker節(jié)點(diǎn)。

master節(jié)點(diǎn):

(1)對A,b賦值,同時(shí)將b廣播出去(這里涉及一個(gè)對廣播這個(gè)函數(shù)不太熟悉的點(diǎn))

(2)對A進(jìn)行劃分,使其被劃分為worker數(shù)量的份數(shù),并將相應(yīng)數(shù)據(jù)發(fā)送給相應(yīng)的工人節(jié)點(diǎn)

(3)接收工人節(jié)點(diǎn)的計(jì)算結(jié)果,并對收到的結(jié)果及進(jìn)行一定的處理從而得到最終結(jié)果

worker節(jié)點(diǎn):

(1)接受來自master的參數(shù)

(2)對接收到的數(shù)據(jù)進(jìn)行計(jì)算

(3)將結(jié)果返回給master

(3)代碼

main.cpp:?

#include <iostream>
#include "mpi.h"
#include "conf.h"
#include "masterMain.h"
#include "workerMain.h"
#include<string.h>

using namespace std;

MPI_Status status;

int main(int argc, char *argv[]) {
    int size, rank;
    MPI_Init(&argc, &argv);
    char message[20];
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    int a[ROW][COL];
    int b[COL], res[COL]; //A為參加運(yùn)算的矩陣,B為參加運(yùn)算的向量,result為結(jié)果
    masterMain mastermain;
    workerMain workerMain1;
    if (rank == MASTER) {
        cout<<"進(jìn)程0"<<endl;
//        cout << "主進(jìn)程開始對矩陣和向量初始化~" << endl;
        for (int i = 0; i < ROW; ++i) {
            for (int j = 0; j < COL; ++j) {
                a[i][j] = 1;
            }
            b[i] = 2;
        }
    }
    //廣播必須在主進(jìn)程之外嗎?(這里不太理解!?。。?    MPI_Bcast(&b, COL, MPI_INT, 0, MPI_COMM_WORLD);
    if(rank==MASTER){
        mastermain.matrixMuliplication(a,b,ROW,COL,size,res,status);
    }else{
        workerMain1.workerRun(a,b,ROW,COL,status);
    }

    MPI_Finalize();

}

?masterMain.cpp

//
// Created by unbuntu-xcr on 22-10-15.
//

#include "masterMain.h"
#include "conf.h"
#include <iostream>

using namespace std;

void masterMain::masterRun() {

}

/**
 *
 * @param a 矩陣A
 * @param b 向量b
 * @param row A的行數(shù)
 * @param col A的列數(shù)
 * @param size 參與運(yùn)算的所有進(jìn)程數(shù)
 * @param rank 當(dāng)前進(jìn)程號
 */
void masterMain::matrixMuliplication(int a[][100], int *b, int row, int col, int size,int *res,MPI_Status status) {
    //master節(jié)點(diǎn)任務(wù):首先是初始化矩陣,再分發(fā)矩陣,收集各個(gè)從節(jié)點(diǎn)返回的結(jié)果,并放到指定位置
    //(1)設(shè)置當(dāng)前進(jìn)程所需的行
    size = size - 1;
    int rowPerWorker;
    rowPerWorker = row / size;
    //master給每個(gè)進(jìn)程傳遞數(shù)據(jù)的偏移量
    int offset = 0;
    cout << "主進(jìn)程開始對數(shù)據(jù)進(jìn)行分發(fā)~" << endl;
    for (int i = 1; i <= size; ++i) {
        rowPerWorker = (i <= row % size ? rowPerWorker + 1 : rowPerWorker);
        int count = row * rowPerWorker;
        //給從進(jìn)程傳遞計(jì)算數(shù)據(jù)
        MPI_Send(&offset,1,MPI_INT,i,FROMMASTER,MPI_COMM_WORLD);
        MPI_Send(&rowPerWorker,1,MPI_INT,i,FROMMASTER,MPI_COMM_WORLD);
        MPI_Send(a[offset], count, MPI_INT, i, FROMMASTER, MPI_COMM_WORLD);
        offset+=rowPerWorker;
    }

    int result[rowPerWorker];
    //MASTER接收從進(jìn)程發(fā)來的消息
    for (int i = 1; i <= size ; ++i) {
        int k=0;
        MPI_Recv(&offset,1,MPI_INT,i,FROMWORKER,MPI_COMM_WORLD,&status);
        MPI_Recv(&rowPerWorker,1,MPI_INT,i,FROMWORKER,MPI_COMM_WORLD,&status);
        MPI_Recv(result,rowPerWorker,MPI_INT,i,FROMWORKER,MPI_COMM_WORLD,&status);
        for (int j = offset; j <= offset+rowPerWorker ; ++j) {
            res[j]=result[k++];
        }
    }

    cout<<"矩陣向量乘結(jié)果為:"<<endl;
    for (int i = 0; i < col; ++i) {
        cout<<res[i]<<" ";
    }

}

?workerMain.cpp

//
// Created by unbuntu-xcr on 22-10-15.
//

#include "workerMain.h"
#include "conf.h"

void workerMain::workerRun(int a[][100], int *b, int row, int col,MPI_Status status) {
    //接收主進(jìn)程傳遞的向量,相應(yīng)矩陣,相應(yīng)數(shù)據(jù),并返回相應(yīng)計(jì)算結(jié)果
    int offset;
    int rowPerWorker;
    //接收偏移量
    MPI_Recv(&offset,1,MPI_INT,MASTER,FROMMASTER,MPI_COMM_WORLD,&status);
    //接收行數(shù)
    MPI_Recv(&rowPerWorker,1,MPI_INT,MASTER,FROMMASTER,MPI_COMM_WORLD,&status);
    //接收矩陣A
    MPI_Recv(a,rowPerWorker*col,MPI_INT,MASTER,FROMMASTER,MPI_COMM_WORLD,&status);

    int result[rowPerWorker];
//    計(jì)算
    for (int i = 0; i < rowPerWorker; ++i) {
        result[i]=0;
        for (int j = 0; j < col; ++j) {
            result[i]+=a[i][j]*b[j];
        }
    }

    MPI_Send(&offset,1,MPI_INT,MASTER,FROMWORKER,MPI_COMM_WORLD);
    MPI_Send(&rowPerWorker,1,MPI_INT,MASTER,FROMWORKER,MPI_COMM_WORLD);
    MPI_Send(result,rowPerWorker,MPI_INT,MASTER,FROMWORKER,MPI_COMM_WORLD);
}

(4)總結(jié)

1)為什么要分這么多CPP文件來寫?因?yàn)橄胧煜++在工程結(jié)構(gòu)上的寫法,所以要慢慢開始以這種寫法來寫

2)問題:mpi_bcast()函數(shù)放在master判斷條件內(nèi)為什么就不能將值廣播出去?

3)注意:寫的時(shí)候,先寫master發(fā)送的,然后寫worker接收相應(yīng)的值,在其進(jìn)行一定處理并發(fā)送給master后,再在master中寫接受到相應(yīng)值之后的操作,這樣不至于邏輯混亂

4)還要注意:send和recv必須保持順序一致,send誰在前,那么接收誰就在前,不然就會出錯(cuò)文章來源地址http://www.zghlxwxcb.cn/news/detail-503394.html

到了這里,關(guān)于MPI實(shí)現(xiàn)矩陣向量乘法的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • R語言矩陣、向量操作(矩陣乘法,向量內(nèi)積、外積(叉乘),矩陣轉(zhuǎn)置,矩陣的逆)

    創(chuàng)建兩個(gè)四維矩陣 A 與 B,A 按列填充,B 按行填充 : 創(chuàng)建兩個(gè) n 維向量 x 和 y : 使用 t(矩陣、向量名) 即可: 輸出如下: 使用 %*% 符號即可: 輸出如下: 在R語言中,兩個(gè)矩陣、向量的內(nèi)積并不只是簡單的 * 號就完事了,而是有以下兩種求法: 或者 其結(jié)果如下: (注意區(qū)分

    2024年02月12日
    瀏覽(24)
  • 線性代數(shù) --- 矩陣與向量的乘法

    線性代數(shù) --- 矩陣與向量的乘法

    矩陣x向量(注:可以把列向量看成是nx1的矩陣) ????????現(xiàn)有如下方程組:? 9個(gè)系數(shù),3個(gè)未知數(shù),等式右邊有3個(gè)數(shù) ????????上述方程組可用矩陣的方式改寫成,一個(gè)系數(shù)矩陣A與一個(gè)未知數(shù)向量x的乘積,乘積的結(jié)果等于右端向量b: 現(xiàn)在我們分別用兩種方法,行乘和

    2024年02月05日
    瀏覽(33)
  • 矩陣與向量的運(yùn)算:矩陣的加法、數(shù)乘與乘法

    作者:禪與計(jì)算機(jī)程序設(shè)計(jì)藝術(shù) \\\"矩陣與向量的運(yùn)算\\\"是機(jī)器學(xué)習(xí)領(lǐng)域的一個(gè)基礎(chǔ)課。在實(shí)際應(yīng)用中,許多算法都需要涉及到矩陣運(yùn)算。理解并掌握這種運(yùn)算對于解決復(fù)雜的問題和優(yōu)化模型性能至關(guān)重要。本文將帶您快速了解矩陣的概念,以及如何進(jìn)行矩陣運(yùn)算。 \\\"行列式\\\"是指

    2024年02月11日
    瀏覽(19)
  • 線性代數(shù)矩陣乘法中的行向量和列向量

    線性代數(shù)矩陣乘法中的行向量和列向量

    在矩陣中有兩個(gè)概念,行向量與列向量,這是從兩個(gè)不同的角度看待矩陣的組成。這篇文章將從 行向量 和 列向量 兩個(gè)角度來分解 矩陣的乘法 。 假設(shè)有兩個(gè)矩陣 A 和 B 一般矩陣的乘法分解 簡單的理解就是A矩陣的第一行與B矩陣的第一列逐元素相乘,就是 結(jié)果矩陣 的左上角

    2024年02月11日
    瀏覽(28)
  • <3>【深度學(xué)習(xí) × PyTorch】必會 線性代數(shù) (含詳細(xì)分析):點(diǎn)積 | 矩陣-向量積 | Hadamard積 | 矩陣乘法 | 范數(shù)/矩陣范數(shù)

    ? 拍照的意義在于你按下快門的那一刻,萬里山河的一瞬間變成了永恒。 ? ??作者主頁: 追光者♂?? ???????? ??個(gè)人簡介: ? ??[1] 計(jì)算機(jī)專業(yè)碩士研究生?? ? ??[2] 2022年度博客之星人工智能領(lǐng)域TOP4?? ? ??[3] 阿里云社區(qū)特邀專家博主?? ? ??[4] CSDN-人工智能領(lǐng)域

    2024年02月05日
    瀏覽(33)
  • 【HNU分布式與云計(jì)算系統(tǒng)】MPI實(shí)現(xiàn)矩陣乘矩陣運(yùn)算

    【HNU分布式與云計(jì)算系統(tǒng)】MPI實(shí)現(xiàn)矩陣乘矩陣運(yùn)算

    實(shí)驗(yàn)環(huán)境 操作系統(tǒng):Ubuntu 20.04 編程語言:C++ 實(shí)驗(yàn)原理 什么是MPI MPI是一個(gè)跨語言的通訊協(xié)議,用于編寫并行計(jì)算機(jī)。支持點(diǎn)對點(diǎn)和廣播。MPI是一個(gè)信息傳遞應(yīng)用程序接口,包括協(xié)議和和語義說明,他們指明其如何在各種實(shí)現(xiàn)中發(fā)揮其特性。MPI的目標(biāo)是高性能,大規(guī)模性,和

    2023年04月08日
    瀏覽(21)
  • 矩陣最小二乘法問題求解

    超定方程組是指方程個(gè)數(shù)大于未知量個(gè)數(shù)的方程組。對于方程組 A x = b Ax=b A x = b , A A A 為n×m矩陣,如果R列滿秩,且nm。則方程組沒有精確解,此時(shí)稱方程組為超定方程組。 在實(shí)驗(yàn)數(shù)據(jù)處理和曲線擬合問題中,求解超定方程組非常普遍。比較常用的方法是 最小二乘法 。 如果

    2024年02月05日
    瀏覽(20)
  • 【矩陣乘法】C++實(shí)現(xiàn)外部矩陣乘法

    【矩陣乘法】C++實(shí)現(xiàn)外部矩陣乘法

    ? 使用文件和內(nèi)存模擬系統(tǒng)緩存,并利用矩陣乘法驗(yàn)證實(shí)際和理論情況。 設(shè)計(jì)一個(gè) Matrix 類,其中 Matrix 是存在磁盤中的一個(gè)二進(jìn)制文件,類通過保存的矩陣屬性來讀取磁盤。前八個(gè)字節(jié)為兩個(gè) int32 ,保存矩陣的行列數(shù)。 Matrix中有一個(gè) buffer 成員為讀取到的數(shù)據(jù)緩存,通過

    2024年02月11日
    瀏覽(25)
  • 矩陣乘法,python簡易實(shí)現(xiàn)

    矩陣乘法,python簡易實(shí)現(xiàn)

    1.首先,先了解下矩陣乘法最基本的工作原理,可簡易得理解成 C矩陣(i, j)的值是 由A矩陣 i 行依次與B矩陣 j 列相乘的求和,即: ?2.demo實(shí)現(xiàn) 3、基于矩陣結(jié)果是行和列的對應(yīng)相乘的累和迭代,所以選擇依次增加,核心算法: ? ? ?其中,選取 i、j、k進(jìn)行循環(huán)與迭代,k作為中

    2024年02月11日
    瀏覽(22)
  • markdown實(shí)現(xiàn)矩陣乘法

    [ x y 1 ] = [ f 0 O x 0 f O y 0 0 1 ] [ x ˉ y ˉ z ] (1) left[ begin{matrix} x \\\\ y \\\\ 1 end{matrix} right] = left[ begin{matrix} f 0 O_x\\\\ 0 f O_y\\\\ 0 0 1 end{matrix} right] left[ begin{matrix} bar{x} \\\\ bar{y} \\\\ z end{matrix} right] tag{1} ? x y 1 ? ? = ? f 0 0 ? 0 f 0 ? O x ? O y ? 1 ? ? ? x ˉ y ˉ ? z ? ? ( 1

    2024年02月09日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包