我正在使用MPI OneSided Communication,我有一些 的问题。这是我的代码,为了帮助您理解,这里有一个简短的说明 描述
void evolve_network(u_int32_t *neighborhood, u_int8_t *lattice,
u_int32_t *network, u_int8_t *rule,
int rank, u_int32_t amount_cell_proc,
MPI_Win win)
{
u_int32_t i, j, index_rule;
u_int8_t *temp = malloc (11 * sizeof(u_int8_t));
u_int32_t offset, proc;
for(i = 0; i < amount_cell_proc; i++){
get_index_neighborhood(neighborhood, network, i, 10);
MPI_Win_fence((MPI_MODE_NOPUT|MPI_MODE_NOPRECEDE), win);
for (j = 0; j < 11; j++){
proc = get_process(neighborhood[j], amount_cell_proc);
offset = get_shift(neighborhood[j], amount_cell_proc, rank);
MPI_Get(&temp[j], 1, MPI_UINT8_T, proc, offset, 1, MPI_UINT8_T, win);
}
MPI_Win_fence(MPI_MODE_NOSUCCEED, win);
index_rule = BinaryToDecimal(temp, 10);
lattice[i] = rule[index_rule];
}
}
第一个循环遍历每个进程所拥有的单元格
每个细胞都有它的邻居。邻居是一系列的
由get_index_neighborhood
返回并存储在
邻域数组。然后,在第二个循环内,为每个索引
邻域数组,我得到索引属于哪个进程以及哪个进程
是使用函数get_process
和get_shift
的偏移量
repectively。这两个值都在MPI_GET函数中使用。
evolve_network
的函数在程序中被调用n次
exectuion和每次我计算proc和offset
再次。我想改进它计算这些值一次并存储
它们在一个名为map
的结构中。所以,在其他电话中
evolve_network
函数我从map
strutsure avoid中读取了这些值
不必要的计算这样每个进程都会有一个数组,其中包含需要获取的索引。
我的问题是:无论如何都要一次性获得补偿吗?这样,MPI_GET函数将返回存储在由这些索引指示的窗口中的值。
我不确定我是否足够清楚并为我可怜的英语道歉。
提前致谢