我有3个功能和4个核心。我想使用MPI和C ++在新线程中执行每个函数 我写这个
int rank, size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
size--;
if (rank == 0)
{
Thread1();
}
else
{
if(rank == 1)
{
Thread2();
}
else
{
Thread3();
}
}
MPI_Finalize();
但它只执行Thread1()。我该如何更改代码?
谢谢!
答案 0 :(得分:6)
打印以筛选变量size
的当前值(可能不会减少它),您将找到1
。那就是:“1
进程正在运行”。
您可能以错误的方式运行已编译的代码。考虑使用 mpirun
(或 mpiexec
(取决于您的MPI实施)来执行它,即
mpirun -np 4 ./MyCompiledCode
-np
参数指定您将开始的流程数量(这样做,您的MPI_Comm_size
将为您所期望的4个。)
目前,由于C ++,您没有明确使用任何内容。您可以考虑MPI的某些C ++绑定,例如Boost.MPI
。
我对你提供的code做了一些工作。我更改了一点this 工作 mpi代码(我用大写字母提供了一些必要的修正)。
供参考:
编译(在gcc,mpich下):
$ mpicxx -c mpi1.cpp
$ mpicxx -o mpi1 mpi1.o
执行
$ mpirun -np 4 ./mpi1
输出
size is 4
size is 4
size is 4
2 function started.
thread2
3 function started.
thread3
3 function ended.
2 function ended.
size is 4
1 function started.
thread1
1 function ended.
请注意stdout
可能已经搞砸了。
您确定要以正确的方式编译代码吗?
答案 1 :(得分:2)
问题在于,MPI无法将控制台输入提供给许多进程,而只能进入排名为0
的进程。由于main
中的前三行:
int main(int argc, char *argv[]){
int oper;
std::cout << "Enter Size:";
std::cin >> oper; // <------- The problem is right here
Operations* operations = new Operations(oper);
int rank, size;
MPI_Init(&argc, &argv);
int tid;
MPI_Comm_rank(MPI_COMM_WORLD, &tid);
switch(tid)
{
所有进程,但排名0
阻止等待控制台输入,这是他们无法获得的。您应该重写main
函数的开头,如下所示:
int main(int argc, char *argv[]){
int oper;
MPI_Init(&argc, &argv);
int tid;
MPI_Comm_rank(MPI_COMM_WORLD, &tid);
if (tid == 0) {
std::cout << "Enter Size:";
std::cin >> oper;
}
MPI_Bcast(&oper, 1, MPI_INT, 0, MPI_COMM_WORLD);
Operations* operations = new Operations(oper);
switch(tid)
{
它的工作原理如下:只有排名0
显示提示,然后将控制台输入读入oper
。然后执行来自等级oper
的{{1}}值的广播,以便所有其他进程获得正确的值,创建0
对象,然后分支到适当的函数。