使用C++和OpenMPI我想創建一個向量,然後在主進程中將向量的部分均勻分配給要處理的從進程。因此,如果矢量有100個整數,並且有5個從屬進程,則每個從屬進程將被髮送20個整數的向量。將向量的一部分分配給從進程
下面是我正在嘗試的代碼,但它不工作。
#include <iostream>
#include <list>
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <algorithm>
#include <map>
#include <random>
using namespace std;
int main(int argc, char **argv)
{
int rank, size, tag, rc, i;
MPI_Status status;
vector<int> vec(100);
vector<int> split_vec;
rc = MPI_Init(&argc, &argv);
rc = MPI_Comm_size(MPI_COMM_WORLD, &size);
rc = MPI_Comm_rank(MPI_COMM_WORLD, &rank);
tag=7;
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<> dis;
generate(vec.begin(), vec.end(), [&](){ return dis(gen); });
// 100 ints/5 slave processes
int split_size = vec.size()/size;
// split_size = size of vector of ints that each slave process should get
int offset = 0;
int j = 0;
int max = split_size;
if (rank==0) {
// master process
for (int i=1; i<size; ++i){
split_vec.clear();
while(j < max){
int elements = i_j + offset;
split_vec.push_back(vec[elements]);
j++;
}
max = max + split_size;
offset = offset + split_size;
MPI_Send(&split_vec[0], split_vec.size(), MPI_INT, i, tag, MPI_COMM_WORLD);
else{
// slaves processes
MPI_Recv(&split_vec[0], split_vec.size(), MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
// process the vector
}
MPI_Finalize();
}// main
當我運行上面的代碼我收到以下錯誤:
[comp-01:7562] *** An error occurred in MPI_Recv
[comp-01:7562] *** on communicator MPI_COMM_WORLD
[comp-01:7562] *** MPI_ERR_TRUNCATE: message truncated
[comp-01:7562] *** MPI_ERRORS_ARE_FATAL: your MPI job will now abort
這似乎是工作它的方式通過vector<int> vec(100)
矢量得當,抓住了前二十整數,未來二十年,等但我認爲這是崩潰,因爲我一直覆蓋split_vec
中的元素,車庫值正在使其崩潰。當我打印矢量時,因爲我發送它是在它崩潰之前打印的。
0 64 0 33 0 1819240283 808662067 976302125 892679984 2121015 0 49 0 -773125744 32554 0 0 -773125760 32554 0 0
即使有在vec
矢量沒有0
或負數。所以我試圖通過添加split_vec.clear();
代碼來解決這個問題,但這似乎並不奏效。
下面是我用來編譯和運行它。需要
mpic++ -std=c++11 prog.cpp -o prog.o
mpirun -np 6 prog.o // 5 slave process
你不能在這裏使用'std :: vector :: reserve'!雖然這不會崩潰,但在MPI_Recv' /'MPI_Scatter'調用之後,vector的大小仍爲0!改用'resize'。 – Zulan
「發送的項目數量必須與要接收的項目數量相匹配」這是不正確的。標準(3.2。4)只要求:「接收消息的長度必須小於或等於接收緩衝區的長度。」 – Zulan
@Zulan:謝謝你在我的回答中發現了這些錯誤!我仍然有很多東西需要了解MPI ... – francis