c+中每个进程的相同随机数+;带有MPI的代码 我有C++ MPI代码,它编译并确实在指定的处理器数量(n)上启动。问题在于,它只是简单地进行了n次相同的计算,而不是以n倍的速度进行一次计算

c+中每个进程的相同随机数+;带有MPI的代码 我有C++ MPI代码,它编译并确实在指定的处理器数量(n)上启动。问题在于,它只是简单地进行了n次相同的计算,而不是以n倍的速度进行一次计算,c++,mpi,C++,Mpi,我在不同的网站上发现了很多例子,似乎我没有正确使用MPI_Send和MPI_Receive,但我找不到这些命令中以函数作为输入的实例(我不明白为什么这些MPI命令对函数以外的任何东西都有用) 我的代码如下。本质上,它调用了我编写的C++函数来获得费雪的精确测试p值。随机数是我用来测试速度的 我想让这个程序做的是将Fisher.TwoTailed和每组随机变量(即A、B、C和D)分配到不同的处理器,而不是在多个处理器上进行完全相同的计算。提前感谢您的任何见解——干杯 代码如下: int main

我在不同的网站上发现了很多例子,似乎我没有正确使用MPI_Send和MPI_Receive,但我找不到这些命令中以函数作为输入的实例(我不明白为什么这些MPI命令对函数以外的任何东西都有用)

我的代码如下。本质上,它调用了我编写的C++函数来获得费雪的精确测试p值。随机数是我用来测试速度的

我想让这个程序做的是将Fisher.TwoTailed和每组随机变量(即A、B、C和D)分配到不同的处理器,而不是在多个处理器上进行完全相同的计算。提前感谢您的任何见解——干杯

代码如下:

int 
main (int argc, char* argv[]) 
{ 

  int id;
  int p;
//
//  Initialize MPI.
//
  MPI::Init ( argc, argv );
//
//  Get the number of processors.
//
  p = MPI::COMM_WORLD.Get_size ( );
//
//  Get the rank of this processor.
//
 id = MPI::COMM_WORLD.Get_rank ( );

  FishersExactTest Fishers;

  int i = 0;
  while (i < 10) {
    int A = 0 + rand() % (100 - 0);
    int B = 0 + rand() % (100 - 0);
    int C = 0 + rand() % (100 - 0);
    int D = 0 + rand() % (100 - 0); 
    cout << Fishers.TwoTailed(A, B, C, D) << endl;
    i += 1;
  }

  MPI::Finalize ( );
  return 0;
}
int
main(int argc,char*argv[])
{ 
int-id;
INTP;
//
//初始化MPI。
//
MPI::Init(argc,argv);
//
//获取处理器的数量。
//
p=MPI::COMM_WORLD.Get_size();
//
//获取此处理器的等级。
//
id=MPI::COMM_WORLD.Get_rank();
渔民;测试渔民;
int i=0;
而(i<10){
int A=0+rand()%(100-0);
int B=0+rand()%(100-0);
int C=0+rand()%(100-0);
int D=0+rand()%(100-0);

你应该了解一些关于并行计算和MPI的基本培训。教我基本知识的一个很好的资源是。

你必须告诉MPI如何并行化代码-它不会自动完成


换句话说,您不能在所有系统上初始化MPI,然后将其传递给同一个循环。您要使用每个处理器的
id
来确定它将在循环的哪个部分工作。然后您需要它们将结果全部传递回id 0。

那么,当您运行MPI作业时,您会收到哪些消息?只是重申一下其他人说,您必须明确定义每个处理器的作业是什么…例如..如果您是0级(默认值),则执行此操作..如果您是1级,则如此..(或其他语法)这定义了每个等级的角色。然后,根据您的代码结构,您可以让节点发送/接收、收集、分散等。

以上所有答案都完全正确。让我补充一点:

在这里,因为看起来你只是在做随机抽样,所以你所要做的就是让不同的处理器生成不同的随机数给渔民。TwoTailed是为了确保他们都有不同的PRNG种子:

int 
main (int argc, char* argv[]) 
{ 

  int id;
  int p;
//
//  Initialize MPI.
//
  MPI::Init ( argc, argv );
//
//  Get the number of processors.
//
  p = MPI::COMM_WORLD.Get_size ( );
//
//  Get the rank of this processor.
//
 id = MPI::COMM_WORLD.Get_rank ( );

  FishersExactTest Fishers;

  srand(id);  // <--- each rank gets a different seed

  int i = 0;
  while (i < 10) {
    int A = 0 + rand() % (100 - 0);
    int B = 0 + rand() % (100 - 0);
    int C = 0 + rand() % (100 - 0);
    int D = 0 + rand() % (100 - 0); 
    cout << Fishers.TwoTailed(A, B, C, D) << endl;
    i += 1;
  }

  MPI::Finalize ( );
  return 0;
}
int
main(int argc,char*argv[])
{ 
int-id;
INTP;
//
//初始化MPI。
//
MPI::Init(argc,argv);
//
//获取处理器的数量。
//
p=MPI::COMM_WORLD.Get_size();
//
//获取此处理器的等级。
//
id=MPI::COMM_WORLD.Get_rank();
渔民;测试渔民;

srand(id);//当我运行我发布的代码片段时,我得到了10组np相同的结果,其中np是我告诉代码运行的处理器数量(即mpirun-np np MyExe.cc)但是,是的,这听起来像是搞清楚发送/接收会让我走。发送/接收像字符串、浮点数、整数之类的东西,而我实际上需要有一个函数,Fishers。双尾(a、B、C、D),分配给各个处理器。每个处理器将运行您告诉它运行的作业,因此,除非您在源代码中明确定义它,否则您将观察到相同的结果。
int niters = (10+id)/p;
int i=0;
while (i < niters) {
  ...
}