如何使用MPI_GET一次获取多个值?

时间:2017-10-14 15:02:25

标签: c parallel-processing mpi openmpi

我正在使用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_processget_shift的偏移量 repectively。这两个值都在MPI_GET函数中使用。

evolve_network的函数在程序中被调用n次 exectuion和每次我计算proc和offset 再次。我想改进它计算这些值一次并存储 它们在一个名为map的结构中。所以,在其他电话中 evolve_network函数我从map strutsure avoid中读取了这些值 不必要的计算这样每个进程都会有一个数组,其中包含需要获取的索引。

我的问题是:无论如何都要一次性获得补偿吗?这样,MPI_GET函数将返回存储在由这些索引指示的窗口中的值。

我不确定我是否足够清楚并为我可怜的英语道歉。

提前致谢

0 个答案:

没有答案