gpt4 book ai didi

创建优化的总和减少

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:19:44 24 4
gpt4 key购买 nike

我刚刚开始学习 HPC 类(class),正在做一项作业,我们期望在 MPI_SUM 上实现等同于 MPI_Reduce 的 Reduce 函数……很简单吧?这是我所做的:

我从将数据/数组从所有节点发送到根节点(排名第 0 的进程)的基本概念开始,然后计算总和。

作为第二步,我进一步优化它,以便每个进程将数据发送到它的镜像,计算总和,并且这个过程不断重复,直到结果最终出现在根节点(第 0 个进程)中。我的实现如下:

    for(k=(size-1); k>0; k/=2)
{
if(rank<=k)
{
if(rank<=(k/2))
{
//receiving the buffers from different processes and computing them
MPI_Recv(rec_buffer, count, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
for(i=0; i<count; i++)
{
res[i] += rec_buffer[i];
}
}
else
{
MPI_Send(res, count, MPI_INT, k-rank, 0, MPI_COMM_WORLD);
}
}
}

但问题是,与 MPI_Reduce 函数本身相比,这段代码的性能要差得多。

那么如何进一步优化呢?如果更好,我可以做些什么不同的事情?我不能使求和循环成为多线程,因为我们需要在单线程中进行。我可以优化求和循环,但不确定如何以及从哪里开始。

对于一个非常基本的问题,我深表歉意,但我真的开始涉足 HPC 领域了。谢谢!

最佳答案

您的第二种方法是正确的,因为您进行了相同数量的通信,但是您已经并行化了 reduce 操作(在您的情况下求和)和通信(因为您在子集之间进行通信)。您通常会像 Reduction operator 中描述的那样进行 reduce 操作.

但是,您可能想尝试使用 MPI_Isend 和 MPI_Irecv 进行异步通信,以提高性能并更接近 MPI_Reduce 性能。

@GillesGouillardet 提供了一种实现,你可以看到代码中的通信是通过 isend 和 irecv 完成的(查找“MCA_PML_CALL( isend” 和 “MCA_PML_CALL( irecv” )

关于创建优化的总和减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49473525/

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