2017-12-12 9 views
0

私がやりたいことは、いくつかの文字列に対して基本的なMapReduce操作を実行することです。私がしたい:MPIで文字列の配列を散布する方法C++

  1. は、(同じように)プロセスで
  2. を私のすべてのプロセスに文字列のリストを配布:カスタムクラス(例えばWordWithFrequency)のオブジェクトに受け取った文字列の地図、
  3. 収集します追加の操作のためにそれらをプロセスに再び送ります。

これは簡単な作業であるはずですが、正しく実行する方法が見つかりませんでした。ここに私の壊れたコードは次のとおりです。

#include <boost/mpi.hpp> 
... 

int main(int argc, char *argv[]) { 
    // Initialize the MPI environment. 
    mpi::environment env(argc, argv); 
    mpi::communicator world; 

    vector<string> words = { "foo", "bar", "baz", "..." }; 
    const int wordCount = words.size(); 
    const int wordsPerProcess = wordCount/world.size(); 
    vector<vector<string> > wordsByProcess(world.size(), vector<string>()); 
    for (int j = 0; j < world.size(); ++j) { 
     for (int k = 0, wordIndex = j * wordsPerProcess + k; 
      k < wordsPerProcess && wordIndex < wordCount; ++k, ++wordIndex) { 
      wordsByProcess[j].push_back(words[wordIndex]); 
     } 
    } 

    vector<string> subWords; 
    mpi::scatter(world, wordsByProcess, subWords, 0); 
    // subWords is equal to wordsByProcess[world.rank()] here in every process. 

散布:それはBoost.MPIと本当に簡単な作業です

Process 0 got words: 
�R 


Process 1 got words: 
+0

'new []'よりも 'std :: vector'のようなものを試してみてください。メモリ管理の問題が大幅に軽減されるので、あなたの人生は大幅に*簡単になります。 – tadman

+0

@tadman私は(実際、私は確信しています)問題は配列ではなく、 'MPI_Scatter'であると思います。私はここで何か完全に間違っていますが、私はインターネット上で文字列散乱の一例を見つけることができませんでした。 ps。 'std :: vector'は役に立たなかった。 – smddzcy

+0

この特殊なケースでは、すべての問題を魔法のように修正するつもりはありませんが、メモリリークを追跡する日数を無駄にしないため、長期的には役立ちます。 – tadman

答えて

0

#include <iostream> 
#include <fstream> 
#include <mpi.h> 
#include <vector> 

... 

int main(int argc, char *argv[]) { 
    // Initialize the MPI environment 
    MPI_Init(&argc, &argv); 

    // Find out the process rank and the world size 
    int world_rank; 
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); 
    int world_size; 
    MPI_Comm_size(MPI_COMM_WORLD, &world_size); 

    vector<string> words = { "a", "bc", "d" }; 
    const int wordsLength = words.size(); 
    const int wordsPerProcess = wordsLength/world_size; 

    string *subWords = new string[wordsPerProcess]; 
    MPI_Scatter(&words, wordsPerProcess, MPI_CHAR, subWords, wordsPerProcess, ???customDataType???, 0, MPI_COMM_WORLD); 

    printf("Process %d got words:\n", world_rank); 
    for (int i = 0; i < wordsPerProcess; ++i) { 
     cout << subWords[i] << endl; 
    } 

    ... 

出力が実行から実行へ変更するいくつかの面白い文字です要素のベクトルを取ります。要素のベクトルは、対応する値が送信されるプロセス番号でインデックスされます。詳細については、次を参照してください。http://www.boost.org/doc/libs/1_41_0/doc/html/boost/mpi/scatter.html

関連する問題