2014-10-16 3 views
0

좋은 아침 내가 분산 이미지 정규화 알고리즘을 구현하고있어하는 I 직렬화 코드를 포함하는 클래스 픽셀로 부스트 :: MPI를 사용하고,부스트 :: MPI 전송 배열

#ifndef PIXEL_H 
#define PIXEL_H 

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

class Pixel 
{ 
    private: 
     unsigned char m_red; 
     unsigned char m_green; 
     unsigned char m_blue; 
     friend class boost::serialization::access; 

     template <class Archive> 
     void serialize(Archive &ar, const unsigned int version) { 
      ar & m_red; 
      ar & m_green; 
      ar & m_blue; 
     } 
    public: 
     Pixel(); 
     Pixel(unsigned char red,unsigned char green,unsigned char blue) : m_red(red), m_green(green), m_blue(blue) {}; 
     virtual ~Pixel(); 
     unsigned char getRed(); 
     void setRed(unsigned char val); 
     unsigned char getGreen(); 
     void setGreen(unsigned char val); 
     unsigned char getBlue(); 
     void setBlue(unsigned char val); 
     void setColor (unsigned char red,unsigned char green,unsigned char blue); 
}; 

주요. CPP는

#include <iostream> 
#include <boost/mpi.hpp> 
#include <vector> 
#include "include/Pixel.h" 
#include <cstdlib> 
#include <ctime> 

#define ALTEZZA 2 
#define LARGHEZZA 2 

namespace mpi=boost::mpi; 

int main(int argc, char * argv[]) { 
    std::cout<<"Inizializzazione dell'ambiente MPI"<<std::endl; 
    mpi::environment env; 
    mpi::communicator world; 
    Pixel **vettore; 
    int i,j; 

    //Inizializzazione della matrice di test 
    if(world.rank() == 0){ 
     std::cout<<"Inizializzazione matrice di test..."<<std::endl; 
     std::srand(std::time(0)); 
     vettore = new Pixel *[ALTEZZA]; 
     for (i = 0; i < ALTEZZA; i++) { 
      vettore[i] = new Pixel[LARGHEZZA]; 
     } 
     for (i = 0; i < ALTEZZA; i++) { 
      for (j = 0; j < LARGHEZZA; j++) { 
       vettore[i][j].setColor(std::rand() % 256, std::rand() % 256, std::rand() % 256); 
       std::cout<<"Vettore["<<i<<"]["<<j<<"] = ("<<int(vettore[i][j].getRed())<<","<<int(vettore[i][j].getGreen())<<","<<int(vettore[i][j].getBlue())<<");"<<std::endl; 
      } 
     } 
    } 

    if (world.rank() == 0) { 
     std::cout<<"Invio matrice.."<<std::endl; 
     world.send(1, 0, vettore[0]); 
    }else { 
     Pixel *px; 
     world.recv(0, 0, px); 
      for (j = 0; j < LARGHEZZA; j++) { 
       std::cout<<int(px[j].getRed())<<" "<<int(px[j].getGreen())<<" "<<int(px[j].getBlue())<<std::endl; 
      } 
    } 
    return 0; 
} 

입니다하지만 난 수신 프로세스 인쇄에 프로그램이

Inizializzazione dell'ambiente MPI 
Inizializzazione dell'ambiente MPI 
Inizializzazione matrice di test... 
Vettore[0][0] = (170,103,165); 
Vettore[0][1] = (84,0,186); 
Vettore[1][0] = (93,228,162); 
Vettore[1][1] = (31,100,204); 
Invio matrice.. 
170 103 165 
217 1 0 
같은 잘못된 값을 cout을 실행할 때

내가 문제를 2 차원 배열로 생각한다. 왜냐하면 내가 std :: vector를 사용하면이 문제는 없지만 왜 이해가되지 않기 때문이다.

답변

0

나는 (내가 할 수있는 MPI 설치를하지 않는 한 내가 테스트 할 수 없습니다 ..) 여러 문제가 상상 첫째

, 당신의 send() 현재는 과부하 유발되어, 잘못 :

를 recei에

world.send(1, 0, vettore[0], 2); // 2 Pixels 

둘째 :

template<typename T> void send(int, int, const T &) const; 

하지만 원시 배열을 보내려고, 여기 수정 예를 들어, 수를 통과 할 수있다 상상 측면 VER 예를 들어 .. (이 나는 확실하지 않다),하지만 난 당신이에 데이터를 읽을 수있는 적절한 배열을 가질 필요가 상상 :

Pixel px[LARGHEZZA]; 
world.recv(0, 0, px, 2); 

내가이 문제를 해결해야한다고 생각 ...