我是使用MPI进行并行编程的新手......我需要并行化一个300x200的Lattice Boltzman立方体..我根据大小将200分成块来管理分块行...但是我的代码仅在有4个时才有效和8个内核......我需要在16个内核上运行该程序。任何人都可以指导我如何为16个内核划分200 ..
我目前正以下列方式分裂:
.
.
.
MPI_Init( &argc, &argv );
/* size and rank will become ubiquitous */
/* get no of process (size) & rank of each proces*/
MPI_Comm_size( MPI_COMM_WORLD, &size );
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
start= (200 / size) * rank;
end = start + (200 / size);
.
.
.
for(ii=start;ii<end;ii++) {
for(jj=0;jj<300;jj++)
.
.
.
}
.
.
上述技术只有在200%大小= 0时才能工作,对于16个核心大小= 16,因此这种方法会失败。任何人都可以建议一种更通用的分块方法...这将使程序独立(如果可能的话)我将运行它的核心数量。
答案 0 :(得分:0)
解决这个问题的最简单方法是将'start'和'end'计算为
slice_size = (200 + size - 1)/size; // max. amount of rows per core
start = rank * slice_size;
end = min(start + slice_size, 200);
在这种情况下,某些核心可能会欠载。
如果晶格不是按行划分,而是按行和列划分,或者甚至在非矩形区域划分,例如,使用晶格的线性表示,可以实现更好的可扩展性,如下所示:
total_cells = rows * columns;
common_piece_size = (total_cells + size - 1) / size;
start = rank * common_piece_size;
end = min(start + common_piece_size, total_size);
for (i = start; i < end; i++) {
row = i / columns;
col = i % columns;
// process cell [col, row]
}
。这需要更复杂的进程间通信。