如何在16个核心上划分300 * 200格子Boltzmann立方体 - MPI

时间:2013-11-20 23:45:07

标签: parallel-processing mpi

我是使用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,因此这种方法会失败。任何人都可以建议一种更通用的分块方法...这将使程序独立(如果可能的话)我将运行它的核心数量。

1 个答案:

答案 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]
}

。这需要更复杂的进程间通信。