【MPI编程】任意数节点的树形求和(高性能计算)
生活随笔
收集整理的這篇文章主要介紹了
【MPI编程】任意数节点的树形求和(高性能计算)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
簡述
之前寫過一個(gè)只能在2冪次數(shù)的節(jié)點(diǎn)環(huán)境下使用的樹形結(jié)構(gòu)求和
【MPI編程】2冪節(jié)點(diǎn)的樹形求和(高性能計(jì)算)
稍微修改了一下對應(yīng)代碼,就可以使用了。其實(shí)就是在邏輯上擴(kuò)充一下為2的冪數(shù)。也就是說接受節(jié)點(diǎn)上的只要不越界就是任然要接受。如果越界了,就說明對應(yīng)的在后面的節(jié)點(diǎn)是不存在的。那么就保留當(dāng)前節(jié)點(diǎn)就好了。
運(yùn)行效果
輸入為一個(gè)文件:
內(nèi)容為:
代碼
#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 main(void) {int len;double scalar, local_sum = 0;int comm_sz;int my_rank;int divided_len;int last_divided;int begin_i;int oper_N = 2;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;}ifstream cin("D:\\C++\\VS\\repo\\MPI-DEMO\\MPI-DEMO\\input.txt");cin >> len; // 輸入數(shù)據(jù)長度divided_len = len / comm_sz;last_divided = len % comm_sz;if (my_rank < last_divided) {divided_len++;begin_i = my_rank * divided_len;}else {begin_i = (my_rank - last_divided) * divided_len + ((divided_len + 1)* last_divided);}// 局部和for (int i = 0; i < len; ++i) {cin >> scalar;if (i < begin_i || i >= begin_i + divided_len) continue;else {local_sum += scalar;}}// 假設(shè)comm_sz不一定是2的冪// 樹形求和while (oper_N <= comm_sz || (oper_N > comm_sz && oper_N / 2 < comm_sz)) {// recieve if (my_rank % oper_N == 0) {// 只需要控制有些收,有些不收即可if (my_rank + oper_N / 2 < comm_sz) {MPI_Recv(&scalar, 1, MPI_DOUBLE, my_rank + oper_N / 2, 0, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);local_sum += scalar;}}// sendelse if (my_rank % oper_N == oper_N / 2) {MPI_Send(&local_sum, 1, MPI_DOUBLE, my_rank - oper_N / 2, 0, MPI_COMM_WORLD);}else { break; }oper_N *= 2;}if (my_rank == 0) {cout << local_sum << endl;}MPI_Finalize();return 0; }總結(jié)
以上是生活随笔為你收集整理的【MPI编程】任意数节点的树形求和(高性能计算)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【MPI程序】向量乘法,向量点积(高性能
- 下一篇: 【MPI编程】任意节点数的蝶形求和(高性