前提・実現したいこと
raspberry piからデータをopenMPIでmacに送りたい。
発生している問題・エラーメッセージ
単一ノードでは並列化ができているが、複数ノードで実行しようとすると実行結果が出力されない。
該当のソースコード
データを送る側
c++
1#include <stdio.h> 2#include "opencv2/opencv.hpp" 3#include "opencv2/highgui.hpp" 4#include "mpi.h" 5 6using namespace cv; 7using namespace std; 8 9int main(int argc, char** argv) 10{ 11 int rank, procs, j = 0; 12 size_t total; 13 size_t elemsize; 14 int sizes[3]; 15 MPI_Status status; 16 MPI_Request request; 17 18 Mat frame; 19 VideoCapture cap(0); 20 21 MPI_Init(&argc, &argv); 22 MPI_Comm_rank(MPI_COMM_WORLD, &rank); 23 MPI_Comm_size(MPI_COMM_WORLD, &procs); 24 25 if (!cap.isOpened()){ 26 cerr << "ERROR! Unable to open camera\n"; 27 return -1; 28 } 29 30 while(cap.read(frame)) 31 { 32 if (frame.empty()) { 33 cerr << "ERROR! Blank frame grabbed \n"; 34 break; 35 } 36 37 if (j == 0) { 38 sizes[2] = frame.elemSize(); 39 Size s = frame.size(); 40 sizes[0] = s.height; 41 sizes[1] = s.width; 42 MPI_Send(sizes, 3, MPI_INT, 1, 0, MPI_COMM_WORLD); 43 } 44 45 MPI_Send(frame.data, sizes[0] * sizes[1] * 3, MPI_CHAR, 1, 1, MPI_COMM_WORLD); 46 j++; 47 48 //MPI_Send(&frame, 1, mat_8uc3, 1, 99, MPI_COMM_WORLD); 49 50 const int key = waitKey(1); 51 52 //qボタンが押されたとき 53 if(key == 'q') { 54 break; 55 } 56 } 57 return 0; 58} 59
データを受け取る側
#include <stdio.h> #include "opencv2/opencv.hpp" #include "opencv2/highgui.hpp" #include "mpi.h" using namespace cv; using namespace std; int main(int argc, char** argv) { int rank, procs, j = 0; size_t total; size_t elemsize; int sizes[3]; MPI_Status status; MPI_Request request; Mat frame; VideoCapture cap(0); MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &procs); while(1) { //MPI_Recv(&frame, 1, mat_8uc3, 0, 99, MPI_COMM_WORLD, &status); if (j == 0) { MPI_Recv(sizes,3, MPI_INT, 0, 0, MPI_COMM_WORLD, &status); frame.create(sizes[0], sizes[1], CV_8UC3); } MPI_Recv(frame.data, sizes[0] * sizes[1] * 3, MPI_CHAR, 0, 1, MPI_COMM_WORLD, &status); j++; imshow("camera", frame); const int key = waitKey(1); //qボタンが押されたとき if(key == 'q') { break; } } return 0; }
試したこと
mpirun --hostfile node.txt -np 1 Ras_Send : -np 1 Ras_Recv
で実行したところ、
Warning: Permanently added '192.168.35.35' (ECDSA) to the list of known hosts.
とだけ表示されて標準出力が実行されない。
補足情報(FW/ツールのバージョンなど)
macOS Catalina
raspberry pi 4
openMPI ver.4.0.0
あなたの回答
tips
プレビュー