MPI中每个进程的随机数

Eli*_*ior 5 c++ random mpi mpich

我正在使用MPICH2来实现"Odd-Even"排序.我做了实现但是当我随机化到每个进程的值时,相同的数字被随机化到所有进程.

这是每个进程的代码,每个进程随机化他的值.

int main(int argc,char *argv[])
{
    int  nameLen, numProcs, myID;
    char processorName[MPI_MAX_PROCESSOR_NAME];
    int myValue;

    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&myID);
    MPI_Comm_size(MPI_COMM_WORLD,&numProcs);    
    MPI_Get_processor_name(processorName,&nameLen);
    MPI_Status status;

    srand((unsigned)time(NULL));
    myValue = rand()%30+1; 

    cout << "myID: " << myID << " value: " << myValue<<endl;
    MPI_Finalize();

    return 0;
 }
Run Code Online (Sandbox Code Playgroud)

为什么每个过程都获得相同的价值?

编辑:谢谢你的答案:)

我换了线

 srand((unsigned)time(NULL));
Run Code Online (Sandbox Code Playgroud)

 srand((unsigned)time(NULL)+myID*numProcs + nameLen);
Run Code Online (Sandbox Code Playgroud)

它为每个进程提供不同的值:)

luk*_*k32 6

这项任务并非无足轻重.

因为你初始化你得到相同的数字srand()time(0).什么time(0)是返回当前秒(从纪元开始).因此,如果所有进程都具有同步时钟,则只要它们srand()在相同的秒上调用,所有进程都将使用相同的种子初始化,这很可能.我甚至在大型机器上都观察到了这一点.

解决方案1.使用本地值初始化随机种子.

我所做的是将计算随机种子的一些内存使用量与计算cat /proc/meminfo结合起来/dev/random,这些内存使用比物理机器更本地化.请注意,对于1台计算机上的N个任务,这可能仍会失败.但如果我没记错,我也用过task_id.任何本地任务就足够了.结合东西也是个好主意.毕竟这些计算与实际计算相比应该非常短.并且最好保持安全.

解决方案2.计算种子作为预处理步骤.

您还可以task 0使用您的方法生成随机种子并将其传播send-to-all.但是,当进行大规模(例如10 ^ 5个进程)时,它可能会出现扩展问题.您还可以使用任何其他方法来加载参数,并准备种子作为预处理步骤.然而,它也涉及一些非平凡的工作.