【MPI程序】向量乘法,向量点积(高性能计算)
生活随笔
收集整理的這篇文章主要介紹了
【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(÷d_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(÷d_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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【中文模板】Latex如何写中文文档
- 下一篇: 【MPI编程】任意数节点的树形求和(高性