gpt4 book ai didi

c - MPI_Gather 金额不等?

转载 作者:行者123 更新时间:2023-12-01 01:26:19 26 4
gpt4 key购买 nike

我正在使用 MPI_Scatter 和 MPI_Gather 实现矩阵乘法。如果进程数平均分为矩阵行数和列数,我的代码就可以正常工作。但是,当它们不均匀划分时,它会在 MPI_Gather 上崩溃。这是有道理的,因为 MPI_Gather 期望从每个进程中获得一定数量,而不会从最后一个进程中收到那么多。有没有办法使这项工作?我查看了 MPI_Gatherv,但我不希望数据之间有空格 - 我只是希望它收到的数量少于最后一个过程的数量。

目前,我正在使用 MPI_Scatter 向每个进程发送以下数量:

ceil(N/size)

其中 size 是我使用的进程数,N 是矩阵中的行数和列数。最后一个进程将不会像其他进程那样接收到那么多的数据。当我到达最后一个过程中的数据末尾时,我确保停止进行乘法运算。如果没有办法改变我的 MPI_Gather 调用,我可以改变这个分散+乘法部分。任何帮助表示赞赏。

最佳答案

我认为包装MPI_ScattervMPI_Gatherv在辅助函数中是要走的路。今天我写了一对这样的包装器作为我暑期学校的一部分,如果您仍然需要解决方案,请随时使用它们。

void fillCounts(int rank, int size, int totalCount, int *counts, int *offsets) {
int i;
int n;
int sum;

n = totalCount / size;
for (i = 0; i < size; i++)
counts[i] = n;

for (i = 0; i < totalCount % size; i++)
counts[i] += 1;

sum = 0;
for (i = 0; i < size; i++) {
offsets[i] = sum;
sum += counts[i];
}
}

int scatter01(const void *sendBuf, int totalCount, MPI_Datatype dataType,
void *recvBuf, int *recvCount,
int root, MPI_Comm comm) {
int rank;
int size;
int *counts;
int *offsets;
MPI_Comm_rank(comm, &rank);
MPI_Comm_size(comm, &size);

counts = alloca(size * sizeof(int));
offsets = alloca(size * sizeof(int));
fillCounts(rank, size, totalCount, counts, offsets);

*recvCount = counts[rank];
return MPI_Scatterv(sendBuf, counts, offsets, dataType,
recvBuf, counts[rank, dataType, root, comm);
}

int gather01(void *recvBuf, int totalCount, MPI_Datatype dataType,
const void *sendBuf, int root, MPI_Comm comm) {
int rank;
int size;
int *counts;
int *offsets;
MPI_Comm_rank(comm, &rank);
MPI_Comm_size(comm, &size);

counts = alloca(size * sizeof(int));
offsets = alloca(size * sizeof(int));
fillCounts(rank, size, totalCount, counts, offsets);

return MPI_Gatherv(sendBuf, counts[rank], dataType,
recvBuf, counts, offsets, dataType, root, comm);
}

用法示例:
double globData[N];
double partData[N/size+1];
int n;

scatter01(globData, N, MPI_DOUBLE, partData, &n, 0, MPI_COMM_WORLD);
gather01 (globData, N, MPI_DOUBLE, partData, 0, MPI_COMM_WORLD);

关于c - MPI_Gather 金额不等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21790384/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com