Parallel processing 如何将300*200格子玻尔兹曼立方体划分为16个核-MPI

Parallel processing 如何将300*200格子玻尔兹曼立方体划分为16个核-MPI,parallel-processing,mpi,Parallel Processing,Mpi,我是新的并行编程使用MPI。。。我需要平行化一个300x200格子玻尔兹曼立方体。。我通过根据大小将200分为块来管理按行分块。。。然而,我的代码只有在有4个和8个内核时才能工作。。。我需要在16个核上运行这个程序。有人能告诉我如何将200除以16个核吗 我目前正在以以下方式进行拆分: . . . MPI_Init( &argc, &argv ); /* size and rank will become ubiquitous */ /* get no of process

我是新的并行编程使用MPI。。。我需要平行化一个300x200格子玻尔兹曼立方体。。我通过根据大小将200分为块来管理按行分块。。。然而,我的代码只有在有4个和8个内核时才能工作。。。我需要在16个核上运行这个程序。有人能告诉我如何将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++)
.
. 
.
}

.
.
。
.
.
MPI_Init(&argc,&argv);
/*规模和排名将变得无处不在*/
/*获取每个进程的进程数(大小)和等级*/
MPI_通信大小(MPI_通信世界和大小);
MPI通信等级(MPI通信世界和等级);
开始=(200/尺寸)*排名;
结束=开始+(200/尺寸);
.
.
.

对于(ii=开始;ii最简单的解决方法是将“开始”和“结束”计算为

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]
}
total_cells=行*列;
普通单元大小=(总单元+大小-1)/大小;
开始=等级*普通件大小;
结束=最小值(开始+普通工件尺寸,总尺寸);
for(i=start;i

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

谢谢。。因此我需要在东北-东南-西部的所有方向进行通信,对吗?…但在这种情况下,通信开销不是会更大吗?这取决于情况。通常超级计算机具有非常快速的网络,并且基于现代MPI实现使用的多核系统自动共享内存。当然,您应该尽量减少通信(尤其是阻塞的通信)在可能的情况下,每个核心的负载平衡对于可伸缩性是非常重要的。当然,如果核心的数量永远不会超过20个,那么您可以只按行分割,并且可能欠加载最后一个核心,这样整个利用率仍然>95%。如果我这样做,..end=min(开始+200/大小,200);for size=16..最后8行仍然未计算..我如何计算剩余的单元格..?哦,对不起,这是我的错误。您应该使用
(200+size-1)/size
而不是
200/size
(在
start
的计算中!).我已经修正了答案。不用担心…我试着按照你建议的方式切片,但我没有得到正确的结果…只是为了确保我以正确的方式进行操作..我在南北方向发送消息..它需要更多的通信吗?我还在将for循环划分为for(ii=start;ii)