MPI中每个进程的随机数
Posted
技术标签:
【中文标题】MPI中每个进程的随机数【英文标题】:Random Number to each Process in MPI 【发布时间】:2013-12-07 02:52:07 【问题描述】:我正在使用 MPICH2 来实现“奇偶”排序。 我做了实现,但是当我随机分配每个进程他的值时, 相同的数字随机分配给所有进程。
这里是每个进程的代码,每个进程随机分配他的值..
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;
为什么每个进程得到相同的值?
编辑:感谢您的回答:)
我换行了
srand((unsigned)time(NULL));
到
srand((unsigned)time(NULL)+myID*numProcs + nameLen);
它为每个进程提供不同的值:)
【问题讨论】:
【参考方案1】:这项任务并不简单。
您得到相同的数字,因为您使用 time(0)
初始化 srand()
。 time(0)
所做的是返回当前秒数(自纪元以来)。因此,如果所有进程都具有同步时钟,那么只要它们在同一秒调用srand()
,所有进程都将使用相同的种子进行初始化,这很可能。我什至在大型机器上也观察到了这一点。
解决方案 1. 使用局部值初始化随机种子。
我所做的是将cat /proc/meminfo
和/dev/random
的一些内存使用量包含在计算随机种子中,这对物理机器来说比时钟更本地化。请注意,对于一台机器上的 N 个任务,这可能仍然会失败。但如果我没记错的话,我也使用了task_id
。任何本地任务都足够了。结合东西也是个好主意。毕竟,与实际计算相比,这些计算应该非常短。并且最好保持安全。
解决方案 2. 计算种子作为预处理步骤。
您还可以使用您的方法从task 0
生成随机种子,并使用send-to-all
传播它。但是,在进行大规模(例如 10^5 个进程)时,它可能会遇到扩展问题。您还可以使用任何其他方法来加载参数,并将种子准备为预处理步骤。但是,它也涉及一些不平凡的工作。
【讨论】:
【参考方案2】:这是因为你的种子变化不够,随机性取决于你的种子。
来自srand
docs:
对于调用 srand 时使用的每个不同的种子值, 伪随机数生成器可以预期生成不同的 在随后对 rand 的调用中产生连续的结果。
编辑:尝试预先生成种子或为每个 srand
调用手动更改种子。
【讨论】:
以上是关于MPI中每个进程的随机数的主要内容,如果未能解决你的问题,请参考以下文章