我试图创建一个图像处理程序,其中我只有一个带有按钮的窗口,而没有。我需要在繁重的处理功能上使用 MPI,例如傅立叶变换和高/低通。
我的问题是这个窗口是用 QT 制作的,我无法创建一个单独的窗口来调用另一个任务来完成那些繁重的处理功能。我怎样才能做到这一点?
所以,为了清楚起见,我想要的是:
A - 我的程序被初始化一次。
B - 一旦用户加载图像并单击傅立叶按钮,傅立叶计算将开始。
C - 在傅立叶计算过程中,我必须使用 MPI 进行一些并行化,将一些部分发送到其他进程,然后在傅立叶完成后将它们全部收集起来。
这可能吗?到目前为止,我所拥有的是代码的串行部分并开始使用 MPI。在第一次 glympse 中,我有多个进程运行多个窗口(例如同时打开 5 个 mspaint)。为了解决这个问题,我尝试了这个:
if ( pid == 0 )
{
QApplication a(argc, argv);
MainWindow w;
w.show();
a.exec();
}
它创建了一个窗口。我试图通过这样做来并行化一个 for 循环:
if ( pid == 0 )
{
printf("This is the master task. There are %d tasks in total", nProcs);
for ( i = 1; i < nProcs; i++ )
{
MPI_Send( &complexPixel[i*width/nProcs][0], width*height/nProcs, MPI_DOUBLE, i, tag, MPI_COMM_WORLD );
MPI_Send( &H, width*height, MPI_DOUBLE, i, tag, MPI_COMM_WORLD );
}
}
else
{
printf("This is a slave task. PID = %d\n", pid);
MPI_Recv( &complexPixel, width*height/nProcs, MPI_DOUBLE, 0, tag, MPI_COMM_WORLD, &statusMPI );
MPI_Recv( &H, width*height, MPI_DOUBLE, 0, tag, MPI_COMM_WORLD, &statusMPI );
}
}
DoSomeWork();
if ( pid != 0 )
{
MPI_Send( &T, width*height/nProcs, MPI_DOUBLE, 0, tag, MPI_COMM_WORLD );
printf("Slave work finished.\n");
}
else
{
for ( i = 1; i < nProcs; i++ )
MPI_Recv( &T[i*width/nProcs][0], width*height/nProcs, MPI_DOUBLE, i, tag, MPI_COMM_WORLD, &statusMPI );
printf("Master work finished.\n");
}
现在我被第一个 MPI_Send 卡住了,因为我命令主任务执行整个窗口,似乎这是唯一能够处理它的进程。
感谢您的时间!希望我能让这个工作!