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)
它为每个进程提供不同的值:)
这项任务并非无足轻重.
因为你初始化你得到相同的数字srand()有time(0).什么time(0)是返回当前秒(从纪元开始).因此,如果所有进程都具有同步时钟,则只要它们srand()在相同的秒上调用,所有进程都将使用相同的种子初始化,这很可能.我甚至在大型机器上都观察到了这一点.
解决方案1.使用本地值初始化随机种子.
我所做的是将计算随机种子的一些内存使用量与计算cat /proc/meminfo结合起来/dev/random,这些内存使用比物理机器更本地化.请注意,对于1台计算机上的N个任务,这可能仍会失败.但如果我没记错,我也用过task_id.任何本地任务就足够了.结合东西也是个好主意.毕竟这些计算与实际计算相比应该非常短.并且最好保持安全.
解决方案2.计算种子作为预处理步骤.
您还可以task 0使用您的方法生成随机种子并将其传播send-to-all.但是,当进行大规模(例如10 ^ 5个进程)时,它可能会出现扩展问题.您还可以使用任何其他方法来加载参数,并准备种子作为预处理步骤.然而,它也涉及一些非平凡的工作.
| 归档时间: |
|
| 查看次数: |
5885 次 |
| 最近记录: |