gpt4 book ai didi

c++ - MPI 中每个进程的随机数

转载 作者:行者123 更新时间:2023-11-30 16:51:31 25 4
gpt4 key购买 nike

我正在使用 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);

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

最佳答案

这项任务并不简单。

由于您使用 time(0) 初始化 srand(),因此您得到了相同的数字。 time(0) 的作用是返回当前秒(自纪元以来)。因此,如果所有进程都具有同步时钟,只要它们在同一秒调用 srand() ,所有进程都将使用相同的种子进行初始化,这是很有可能的。即使在大型机器上我也观察到了这一点。

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

我所做的是将 cat/proc/meminfo/dev/random 中的一些内存使用情况纳入到计算随机种子中,这些内存对于物理机来说更加本地化比钟表。请注意,对于一台计算机上的 N 个任务,这可能仍然会失败。但如果我没记错的话,我还使用了 task_id。任何本地任务就足够了。组合东西也是个好主意。毕竟,与实际计算相比,这些计算应该非常短。最好保持安全。

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

您还可以使用您的方法从task 0生成随机种子,并使用send-to-all传播它。不过,当规模很大时(比如 10^5 进程),它可能会遇到扩展问题。您还可以使用任何其他方法来加载参数,并仅准备种子作为预处理步骤。然而,它也涉及一些不平凡的工作。

关于c++ - MPI 中每个进程的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41739318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com