我是使用MPI进行并行编程的新手。我需要并行化一个300x200的格子玻尔兹曼立方体..我通过根据大小将200分成块来管理按行分块。然而,我的代码只有在有4核和8核的情况下才能工作……我需要在16个cores..Can上运行这个程序,任何人请告诉我如何将200划分为16个内核。
我目前使用以下方式进行拆分:
.
.
.
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++)
.
.
.
}
.
.对于16核size=16,仅当200%size =0时,上述技术才有效,因此该方法将失败。谁能建议一个更通用的分块方法,approach..which将使程序独立于(如果可能的话)我将在其上运行它的核心数量。
发布于 2013-11-21 07:53:31
解决这个问题的最简单方法是将“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]
}。不过,这将需要更复杂的进程间通信。
https://stackoverflow.com/questions/20109571
复制相似问题