利用mpi进行sobel边缘检测
sobel edge detection using mpi
我是mpi新手。我正在尝试用mpi并行化我的代码(需要更快地运行一些实验)。它应该是这样工作的:master向slave发送一个字符串数组,slave完成一些工作并将status_ready发送回master。当所有从设备准备就绪时,master进入一个循环,并迭代地向从设备发送一个双矢量,从设备处理该矢量并将其结果(2个矢量)发送回master。当接收到所有tje消息时,master将处理它,循环迭代(master将结果发送给slave等)。它应该像一样工作
#include <iostream>
#include <mpi.h>
#include <cmath>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
//int mod(int z, int l);
int xGradient(Mat image, int x, int y)
{
return image.at<uchar>(y-1, x-1) +
2*image.at<uchar>(y, x-1) +
image.at<uchar>(y+1, x-1) -
image.at<uchar>(y-1, x+1) -
2*image.at<uchar>(y, x+1) -
image.at<uchar>(y+1, x+1);
}
int yGradient(Mat image, int x, int y)
{
return image.at<uchar>(y-1, x-1) +
2*image.at<uchar>(y-1, x) +
image.at<uchar>(y-1, x+1) -
image.at<uchar>(y+1, x-1) -
2*image.at<uchar>(y+1, x) -
image.at<uchar>(y+1, x+1);
}
int main()
{
Mat src, grey, dst;
double start, end;
int i, gx, gy, sum, argc, awal,akhir, size, rank, slave;
int master=0;
char **argv;
// MPI_Status status;
awal= MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
slave=size-1;
start=MPI_Wtime();
if( rank == master )
{
// start=MPI_Wtime();
src= imread("E:/tigaout/Debug/jari.jpg");
cvtColor(src,grey,CV_BGR2GRAY);
//MPI_Send(&(row_pointers[i*share+done][0]), 1, newtype, i, 1, MPI_COMM_WORLD);
dst = grey.clone();
if( !grey.data )
{
return -1;
}
for (i=1; i<slave; i++)
{
MPI_Send(&dst, 1, MPI_DOUBLE, i, 1, MPI_COMM_WORLD);
cout<<"master mengirim data ke rank 1"<<dst<<endl;
}
}
MPI_Barrier(MPI_COMM_WORLD);
if (rank != master)
{
MPI_Recv(&dst, 1, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
cout<<"rank 1 menerima data"<<dst<<endl;
}
for(int y = 0; y < grey.rows; y++)
for(int x = 0; x < grey.cols; x++)
dst.at<uchar>(y,x) = 0;
for(int y = 1; y < grey.rows - 1; y++)
{
for(int x = 1; x < grey.cols - 1; x++)
{
gx = xGradient(grey, x, y);
gy = yGradient(grey, x, y);
sum = abs(gx) + abs(gy);
sum = sum > 255 ? 255:sum;
sum = sum < 0 ? 0 : sum;
dst.at<uchar>(y,x) = sum;
}
}
/* namedWindow("deteksi tepi sobel");
imshow("deteksi tepi sobel", dst);
namedWindow("grayscale");
imshow("grayscale", grey);
namedWindow("Original");
imshow("Original", src);*/
imwrite( "E:/tigaout/Debug/deteksi jari.jpg", dst );
MPI_Barrier(MPI_COMM_WORLD);
end=MPI_Wtime();
cout<<"waktu eksekusi adalah: "<< end-start << " detik " <<endl;
akhir=MPI_Finalize();
//waitKey();
return 0;
}
我已经尝试使用mpi点对点发送/接收来制作此代码。但是我的代码总是错误的,我的错误在哪里,我该如何解决?
通过使用集体,您可能会获得更好的性能,当然也会获得更简单的代码。从设备向主设备发送数据的第一步相当于MPI_Gather。主设备向每个从属设备发送新数据的步骤是MPI_Scatter。
到目前为止,我认为在您的尝试中可能会导致问题的概念部分是MPI程序使用单个程序、多数据编程模型。每个等级都执行相同的代码,但只是得到不同的"等级"值。在您的块if (rank == master)
和if (rank != master)
中似乎可以理解这一点,但当使用屏障或其他集体操作时,您必须记住,在您传递给它的通信器中,没有列将在代码中传递该点,直到所有其他列都到达那里。您对MPI_Send的调用被阻止,因此主列组可能要等到接收列组发布匹配的MPI_Recv之后才能通过第一次发送,即永远不会通过,因为接收列组卡在屏障上。
希望能有所帮助。
相关文章:
- 使用CMake检测支持的C++标准
- 当套接字连接断开时检测C/C++Unix
- C/C++预处理器是否可以检测一些编译器选项
- WMI检测进程创建事件-c++
- SFML C++ Canny边缘检测双刃
- 彩色图像的边缘检测 CannyAlgorithm.
- ffmpeg/opencv 如何在分类后执行边缘检测 帧的类型
- 使用计算机视觉进行产品检测-使用opencv进行边缘检测
- 精明的边缘检测
- C 中视频的OpenCV Canny边缘检测
- 利用mpi进行sobel边缘检测
- 边缘检测-检测错误
- OpenCV在C++中的精明边缘检测
- 我需要修改 Sobel 内核以进行对角线边缘检测.OpenCV和C++
- Sobel 边缘检测错误(OpenCV 错误:断言失败 (DIMS<=2&&Data&&(无符号)i0)
- 获得最大的结构(Canny边缘检测)
- 图形中的拐角和边缘检测
- 边缘检测opencv android
- 如何在iOS中使用Opencv检测嘴唇边缘
- 卡边缘检测OpenCV