2017-12-12 15 views
0

일부 문자열에 대해 기본 MapReduce 작업을 실행하고 싶습니다.MPI에서 문자열 배열을 분산시키는 방법 C++

  1. 과정에서 (동등) 내 모든 프로세스에 문자열 목록,
  2. 배포 : 나는하려면 원하는
  3. 수집, 사용자 정의 클래스의 객체 (예 : WordWithFrequency)에 수신 된 문자열을지도 객체를 생성하고 추가 작업을 위해 프로세스로 다시 보냅니다.

간단한 작업이어야하지만 올바르게 수행 할 수있는 방법을 찾지 못했습니다.

#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. 

분산 :

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

그것은 Boost.MPI와 정말 쉬운 일이있다 :

#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