0
Q
mpi收集數據
A
回答
6
使用MPI_Gatherv
複製MPI_Gather
的功能,但將0
指定爲根級別的塊大小。事情是這樣的:
int rank, size, disp = 0;
int *cnts, *displs;
MPI_Comm_size(MPI_COMM_WORLD, &size);
cnts = malloc(size * sizeof(int));
displs = malloc(size * sizeof(int));
for (rank = 0; rank < size; rank++)
{
cnts[i] = (rank != root) ? count : 0;
displs[i] = disp;
disp += cnts[i];
}
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Gatherv(data, cnts[rank], data_type,
bigdata, cnts, displs, data_type,
root, MPI_COMM_WORLD);
free(displs); free(cnts);
注意MPI_Gatherv
可能比MPI_Gather
顯著比較慢,因爲MPI實現將是最有可能無法優化的通信路徑,並會回落到一些愚蠢的線性執行聚集操作的。因此,仍然可以使用MPI_Gather
並在根進程中提供一些虛擬數據。
您也可以提供MPI_IN_PLACE
作爲根進程發送緩衝區的值,它不會將數據發送給自己,但是接下來您必須爲接收緩衝區中的根數據保留位置(就地操作期望根將其數據直接放置在接收緩衝區內的正確位置):
if (rank != root)
MPI_Gather(data, count, data_type,
NULL, count, data_type, root, MPI_COMM_WORLD);
else
MPI_Gather(MPI_IN_PLACE, count, data_type,
big_data, count, data_type, root, MPI_COMM_WORLD);
相關問題
- 1. 返回MPI數據類型爲MPI收集
- 2. MPI - 異步廣播/收集
- 3. MPI按根進程收集數組
- 4. 使用MPI和C++從不同節點收集數據
- 5. 接收數據MPI產卵Ç
- 6. 在MPI中按元素明智地收集和收集元素
- 7. 收集數據
- 8. 收集數據
- 9. 收集數據
- 10. MPI收集/減少操作困惑?
- 11. Python:從數據集中收集數據
- 12. Android數據收集
- 13. XSLT收集數據
- 14. Lua收集數據
- 15. 上收集數據
- 16. 收集twitter數據
- 17. 元數據收集
- 18. MPI集體參數分配
- 19. MPI接收/收集動態向量長度
- 20. MPI收集不按預期方式合併數組
- 21. 發送特定的數據每個節點,並收集結果MPI的Python
- 22. MPI動態接收
- 23. MPI和集羣
- 24. SQL查詢數據收集
- 25. Scrapy不收集數據
- 26. 數據收集框架
- 27. Mongodb收集到數據幀
- 28. 串口數據收集
- 29. 永久數據收集
- 30. 收集的元數據