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

标签 c++ random mpi mpich

我正在使用 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 中的一些内存使用量包含在计算随机种子中,这对物理机器来说更本地化比时钟。请注意,对于 1 台机器上的 N 个任务,这可能仍然会失败。但如果我没记错的话,我还使用了 task_id。任务本地的任何内容都足够了。组合东西也是个好主意。毕竟,与实际计算相比,这些计算应该非常短。最好保持安全。

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

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

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

相关文章:

c# - 随机选择 2 Int 作为选项

python - mpi4py Reduce() 中可能的缓冲区大小限制

c - 段错误和 MPI

c++ - 如何从模板结构创建二维数组

c++ - 带有 cppwinrt 库的 Toast 通知 Windows 10

c++ - 尝试使用 dev-C++ 创建 .exe 时出现错误 255

java - Android:当点击按钮时->随机字符串

编译器无法正确识别 C++ 枚举

python - 如何在 python 中创建一个加密安全的随机数?

使用 mvapich2 与 openmpi 比较 MPI 线程死锁期间的 CPU 利用率