日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【MPI程序】向量乘法,向量点积(高性能计算)

發(fā)布時(shí)間:2025/4/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【MPI程序】向量乘法,向量点积(高性能计算) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡述

假設(shè),調(diào)用的節(jié)點(diǎn)數(shù)量整除向量的秩。

高性能算法

讓0節(jié)點(diǎn)來讀取文件數(shù)據(jù)
所有的節(jié)點(diǎn)都負(fù)責(zé)計(jì)算,然后,這里使用的是塊分配法。
其他的都是接受到數(shù)據(jù)之后,再進(jìn)行計(jì)算。
而0節(jié)點(diǎn)由于需要負(fù)責(zé)傳輸和調(diào)度,所以它會(huì)在發(fā)送數(shù)據(jù)之后,再進(jìn)行計(jì)算本地的塊。之后,再來接受和保存數(shù)據(jù)。

運(yùn)行效果

輸入的數(shù)據(jù)為:

10 1 2 3 4 5 6 7 8 9 10 2 3 4 5 6 7 8 9 10 11 8

代碼

#include<stdio.h> #include<string.h> #include<mpi.h> #pragma warning(disable : 4996) #define MAX_STRING 100 using namespace std; #include <fstream> #include <iostream>int Find_bin(double x, double *bin_maxes, int bin_count) {for (int i = 0; i < bin_count; ++i) {if (x < bin_maxes[i]) return i;}return bin_count; // 越界 }int main(void) {double *local_vec1, *local_vec2;int len;double scalar, local_sum = 0;int comm_sz;int my_rank;int divided_len;MPI_Init(NULL, NULL);MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);// 假設(shè) n % comm_sz = 0 整除// 只有一個(gè)線程的時(shí)候不操作if (comm_sz <= 1) {MPI_Finalize();return 0;}if (my_rank == 0) {ifstream cin("D:\\C++\\VS\\repo\\MPI-DEMO\\MPI-DEMO\\input.txt");cin >> len; // 輸入數(shù)據(jù)長度local_vec1 = new double[len];local_vec2 = new double[len];for (int i = 0; i < len; ++i) cin >> local_vec1[i];for (int i = 0; i < len; ++i) cin >> local_vec2[i];cin >> scalar;divided_len = len / comm_sz; double * sub_vec = new double[divided_len];// 發(fā)送子串長度for (int i = 1; i < comm_sz; ++i) {MPI_Send(&divided_len, 1, MPI_INT, i, 3, MPI_COMM_WORLD);}// 發(fā)送第一個(gè)串int target = 1;for (int i = divided_len; i < len; i += divided_len) {for (int j = 0; j < divided_len; ++j) {sub_vec[j] = local_vec1[j + i];}MPI_Send(sub_vec, divided_len, MPI_DOUBLE, target, 0, MPI_COMM_WORLD);target++;}// 發(fā)送第二個(gè)串target = 1;for (int i = divided_len; i < len; i += divided_len) {for (int j = 0; j < divided_len; ++j) {sub_vec[j] = local_vec2[j + i];}MPI_Send(sub_vec, divided_len, MPI_DOUBLE, target, 1, MPI_COMM_WORLD);target++;}// 發(fā)送因子for (int i = 1; i < target; ++i) {MPI_Send(&scalar, 1, MPI_DOUBLE, i, 2, MPI_COMM_WORLD);}// 計(jì)算本地的數(shù)據(jù)for (int i = 0; i < divided_len; ++i) {local_sum += (local_vec1[i] * local_vec2[i]);local_vec1[i] *= scalar;local_vec2[i] *= scalar;}// 接受第一個(gè)串target = 1;for (int i = divided_len; i < len; i += divided_len) {MPI_Recv(sub_vec, divided_len, MPI_DOUBLE, target, 0, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);for (int j = 0; j < divided_len; ++j) {local_vec1[j + i] = sub_vec[j];}target++;}// 接受第二個(gè)串target = 1;for (int i = divided_len; i < len; i += divided_len) {MPI_Recv(sub_vec, divided_len, MPI_DOUBLE, target, 1, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);for (int j = 0; j < divided_len; ++j) {local_vec2[j + i] = sub_vec[j];}target++;}// 接受部分和for (int i = 1; i < target; ++i) {MPI_Recv(&scalar, 1, MPI_DOUBLE, i, 2, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);local_sum += scalar;}// 輸出for (int i = 0; i < len; ++i) {cout << local_vec1[i] << " ";}cout << endl;for (int i = 0; i < len; ++i) {cout << local_vec2[i] << " ";}cout << endl;cout << local_sum << endl;delete[] sub_vec;delete[] local_vec1;delete[] local_vec2;} // 運(yùn)算的子節(jié)點(diǎn)else {MPI_Recv(&divided_len, 1, MPI_INT, 0, 3, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);local_vec1 = new double[divided_len];local_vec2 = new double[divided_len];MPI_Recv(local_vec1, divided_len, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);MPI_Recv(local_vec2, divided_len, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);MPI_Recv(&scalar, 1, MPI_DOUBLE, 0, 2, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);for (int i = 0; i < divided_len; ++i){local_sum += local_vec1[i] * local_vec2[i];local_vec1[i] *= scalar;local_vec2[i] *= scalar;}MPI_Send(local_vec1, divided_len, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);MPI_Send(local_vec2, divided_len, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD);MPI_Send(&local_sum, 1, MPI_DOUBLE, 0, 2, MPI_COMM_WORLD);delete[] local_vec1;delete[] local_vec2;}MPI_Finalize();return 0; }

總結(jié)

以上是生活随笔為你收集整理的【MPI程序】向量乘法,向量点积(高性能计算)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。