【发布时间】:2014-09-24 22:56:37
【问题描述】:
我尝试使用 MPI 并行化代码。在此代码中,要并行化的部分位于函数中。我必须将顺序循环转换为 MPI 并行循环。
在这个 MPI 循环之后,我必须得到一个全局数组,我打算使用 MPI_Gather 来拥有这个数组。
代码结构如下:
int main() {
double *array_global;
data1 = read(file1);
data2 = read(file2);
data3 = compute_on_data(data1, data2);
write(file3,data3);
function_to_parallelize(data1, data2, data3, array_global);
}
和函数“function_to_parallelize”:
function_to_parallelize(data1, data2, data3, array_global) {
int i;
for (i = 0;i<size_loop; i++)
{
compute(data1, data2, data3, i, array_global);
}
write(file4, array_global);
}
我的第一个问题是:我可以通过在 main 中执行 MPI 并行化(添加 rank_mpi 和 nb_process 参数):
int main() {
int rank_mpi, nb_process;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank_mpi);
MPI_Comm_size(MPI_COMM_WORLD, &nb_process);
double *array_global;
data1 = read(file1);
data2 = read(file2);
data3 = compute_on_data(data1, data2);
if (rank_mpi = 0) {
write(file3,data3);}
function_to_parallelize(data1, data2, data3, *array_global, rank_mpi, nb_process);
}
并在“function_parallelize”中做
function_to_parallelize(data1, data2, data3, array_global, rank_mpi, nb_process) {
int i;
double *gathered_array_global;
int size_block = size_loop/nb_process;
for (i = rank_mpi*size_block; i < (rank_mpi+1)*size_block; i++)
{
compute(data1, data2, data3, i, array_global);
}
MPI_Gather(gathered_array_global, array_global, 0); // Gather all array_global into gathered_array_global for root process "rank_mpi = 0"
if (rank_mpi = 0) {
write(file4, gathered_array_global);}
}
??我的意思是,如果我在函数中使用 MPI_Gather,我能得到想要的结果吗,即所有 array_global 都被放入我想在 "file4" 中写入的最终数组中?
我只知道,传统上,MPI_Gather 用于 main() 来收集所有子数组。如果我进入例行程序,我认为进程无法与其他进程同步,因此无法在它们之间进行通信,对吗?
我的第二个问题是关于这种并行化采用的策略:您认为所有进程都可以读取“file1”、“file2”而不会发生冲突吗?
写“data3”,我觉得只能写一个进程(rank_mpi = 0),否则执行时会出错
感谢您的帮助和建议
【问题讨论】:
-
如果你想做 array_global 的 MPI_Gather 的唯一原因是把它写出来,你可能想看看 MPI-IO。这可能也有助于编写数据3。
标签: c++ c arrays parallel-processing mpi