[英]Random Number to each Process in MPI
我正在使用 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)
。 time(0)
所做的是返回當前秒(自紀元以來)。 因此,如果所有進程都具有同步時鍾,那么只要它們在同一秒調用srand()
,所有進程都將使用相同的種子進行初始化,這很有可能。 我什至在大型機器上也觀察到了這一點。
解決方案 1. 使用本地值來初始化隨機種子。
我所做的是將來自cat /proc/meminfo
和/dev/random
一些內存使用包含到計算隨機種子中,這些內存使用對物理機器來說比時鍾更本地化。 請注意,對於 1 台機器上的 N 個任務,這可能仍然失敗。 但如果我沒task_id
話,我也使用了task_id
。 任何本地任務就足夠了。 組合東西也是個好主意。 畢竟,與實際計算相比,這些計算應該非常短。 最好保持安全。
解決方案 2. 計算種子作為預處理步驟。
您還可以使用您的方法從task 0
生成隨機種子,並使用send-to-all
傳播它。 但是,在進行大規模(例如 10^5 個進程)時,它可能會遇到擴展問題。 您還可以使用任何其他方法來加載參數,並僅將種子准備作為預處理步驟。 然而,它也涉及一些非平凡的工作。
這是因為你的種子變化不夠,隨機性取決於你的種子。
從srand
文檔:
對於 srand 調用中使用的每個不同種子值,偽隨機數生成器可以預期在隨后的 rand 調用中生成不同的結果序列。
編輯:嘗試預先生成種子或為每個srand
調用手動更改種子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.