0

私はmagick++ライブラリを使って画像を管理しています。openMPI を使用してアルゴリズムを配布したいのですが、オブジェクトを送信することはできますか?

たとえば、私のコードでは

  Image image(imgName);
  int w = image.columns();
  int h = image.rows();
  PixelPacket *pixels = image.getPixels(0, 0, w, h);

pixelsMPI_Send または Scatter で送信できますか? はいの場合、どのデータ型を使用しますか?

4

2 に答える 2

1

一般に、パッキングを行う特別なライブラリがない限り、MPI で特殊なオブジェクトを送信することはできません。組み込みのデータ型は MPI 標準 (MPI 3.0 ページ 665、定義済みの値とハンドルにリストがあります) にリストされていますが、大まかに言えば次のとおりです。

  • MPI_CHAR
  • MPI_INT
  • MPI_FLOAT
  • MPI_DOUBLE
  • MPI_BYTE

それ以外にもたくさんありますが、ほとんどはそのようなものになります。

これらの型を組み合わせて、独自のカスタム データ型を作成できます。たとえば、次のようなものを含む一連の構造体を送信することがわかっている場合:

{
    int index;
    char[100] name;
    double value;
}

それを保持する型を構築できます。これは、名前の連続型であり、データ型全体の構造体型になります (int、名前用に構築する型、および double が含まれます)。

あなたがしなければならないのは、あなたのPixelPacket.

于 2015-01-26T20:57:55.630 に答える
1

私は C++ プログラマーではありませんが、次はあなたが求めていることを行います。基本的に、私は 8 MPI プロセスを開始し (たまたま を使用しています)、マスターはMagick++ を使用mpichしてイメージ (もちろんファイルからレナ) を読み込み、それを各スレーブに送信します。PNGスレーブは Lena を受け取り、受け取ったデータから彼女を再構築し、各スレーブは独自のローカル コピーをJPEG別の名前で として書き出します。

サイズを計算してそれらを渡すのは簡単ですが、私が示しているものとは密接な関係がないため、サイズをだましました。

#include <cstdlib>
#include <iostream>
#include <Magick++.h>
#include "mpi.h"

using namespace std;

int main ( int argc, char *argv[] )
{
   int id,p;
   int number;

   // Initialise MPI
   MPI::Init (argc,argv);

   // Initialize ImageMagick and image processing stuff
   Magick::InitializeMagick(*argv);
   int row,col;
   Magick::Image image;
   int bytes=512*512*3;           // I happen to know Lena is 512x512 and RGB - i.e. 3 bytes/pixel
   unsigned char buffer[bytes];

   //  Get the number of processes
   p = MPI::COMM_WORLD.Get_size();

   //  Get the individual process ID
   id = MPI::COMM_WORLD.Get_rank();

   // Master will read in Lena and send her to all slaves
   if(id==0) 
   {
      cout << "MASTER: The number of processes is " << p << endl;
      // Read in Lena and put her in a buffer to send via MPI
      image.read("lena.png");

      // Convert Lena to a bunch of bytes
      image.write(0,0,512,512,"RGB",Magick::CharPixel,buffer);

      // Send the luscious Lena to all slaves
      for(int z=1;z<p;z++){
         cout << "MASTER: Sending Lena to slave " << z << endl;
         MPI_Send(buffer,bytes,MPI_BYTE,z,0,MPI_COMM_WORLD);
      }
   }else{
      // All slaves will receive Lena and write her out as a JPEG
      cout << "Process:" << id << " Started and waiting for Lena..." << endl;
      MPI_Recv(buffer,bytes,MPI_BYTE,0,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
      cout << "Process:" << id << " Received Lena" << endl;

      // Rebuild Lena from the bunch of bytes and write to "Lena-Rebuilt-<id>.jpg"
      Magick::Image rebuilt(512,512,"RGB",Magick::CharPixel,buffer);
      char filename[100];
      sprintf(filename,"Lena-Rebuilt-%d.jpg",id);
      rebuilt.write(filename);
   }

   //  Terminate MPI
   MPI::Finalize();
   return 0;
}

Makefileはこのように見えます:

all:    main

run:    main
        mpirun -n 8 ./main

main:   main.cpp
        mpic++ main.cpp -o main $$(Magick++-config --cxxflags --libs)

次のように実行されます。

make run
mpirun -n 8 ./main
MASTER: The number of processes is 8
Process:1 Started and waiting for Lena...
Process:3 Started and waiting for Lena...
Process:4 Started and waiting for Lena...
Process:5 Started and waiting for Lena...
Process:7 Started and waiting for Lena...
Process:6 Started and waiting for Lena...
Process:2 Started and waiting for Lena...
MASTER: Sending Lena to slave 1
MASTER: Sending Lena to slave 2
Process:1 Received Lena
MASTER: Sending Lena to slave 3
Process:2 Received Lena
MASTER: Sending Lena to slave 4
Process:3 Received Lena
MASTER: Sending Lena to slave 5
Process:4 Received Lena
MASTER: Sending Lena to slave 6
Process:5 Received Lena
MASTER: Sending Lena to slave 7
Process:6 Received Lena
Process:7 Received Lena

出力は次のようになります。

-rw-r--r--@ 1 mark  staff  150467 23 Oct 15:34 lena.png
-rw-r--r--  1 mark  staff    1786 23 Oct 17:04 main.cpp
-rwxr-xr-x  1 mark  staff   51076 23 Oct 17:14 main
-rw-r--r--@ 1 mark  staff   64755 23 Oct 17:14 Lena-Rebuilt-7.jpg
-rw-r--r--@ 1 mark  staff   64755 23 Oct 17:14 Lena-Rebuilt-6.jpg
-rw-r--r--@ 1 mark  staff   64755 23 Oct 17:14 Lena-Rebuilt-5.jpg
-rw-r--r--@ 1 mark  staff   64755 23 Oct 17:14 Lena-Rebuilt-4.jpg
-rw-r--r--@ 1 mark  staff   64755 23 Oct 17:14 Lena-Rebuilt-3.jpg
-rw-r--r--@ 1 mark  staff   64755 23 Oct 17:14 Lena-Rebuilt-2.jpg
-rw-r--r--@ 1 mark  staff   64755 23 Oct 17:14 Lena-Rebuilt-1.jpg
于 2015-10-23T16:16:02.260 に答える