c - 如何使用 MPI 并行化点积

标签 c parallel-processing mpi message-passing

我一直在尝试学习 MPI,并且我有这个来自 C 的代码片段,应该将其格式化为 MPI 以使其可并行化;

// this is a dot product
int A[100000];
int B[100000];
int C=0;

for (int i=0 ; i<100000; i++){
    c += A[i] * B[i];
}

我对使用 MPI 时如何处理 for 循环有点困惑,但这是我对练习的回答;

// this is a dot product
int A[100000];
int B[100000];
int C=0;
int rootId = 0;
int  numtasks, taskId, len, partner, message;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &taskid);    

for (int i=0 ; i<100000; i++){
    c = A[i] * B[i];

    if(rootId == taskid){
        MPI_Send(&A[100000], &B[100000], MPI_INT, 1, 0, MPP_COMM_WORLD, MPI_Status)

    }else if (rootId < taskId){
        MPI_Recv(C, 100000, MPI_INT, 0, 0, MPP_COMM_WORLD, MPI_Status)
    }

    MPI_Finalize(); return 0;

}

我不确定这是否正确,但我相信我的方向是正确的......

关于 MPI 的问题是,我真的找不到如何用循环重写或构造它的好例子 - Fortran 中有一些例子,但这不是我熟悉的...... 我只在 MPI 中看到了“Hello world”C 的简单示例......但从那里没有得到任何有用的信息。

所有帮助将不胜感激..

最佳答案

是否有拼写错误,您的意思是不是?

for (int i=0 ; i<100000; i++){
    c += A[i] * B[i];
}

并行化很大程度上取决于数组 AB 的分布方式。

最简单的情况,也是内存占用最大的情况,是在所有 MPI 任务上拥有完整的数组 AB。 基于任务排名和任务总数,每个任务可以计算点积的一部分,例如

for (int i=start; i<end; i++) {
    c += A[i] * B[i];
}

然后您可以使用MPI_Reduce()/MPI_Allreduce()MPI_SUM部分点积来获得最终结果。

关于c - 如何使用 MPI 并行化点积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45781405/

相关文章:

c - 使用带有 ISend 和 IRecv 的三个线程使用 MPI 发送消息

java - 防止请求在 JSON 文件更新时从 json 文件中获取数据

c - 将缓冲区 (char*) 传递给 C 中的函数

azure - 使用 Azure Service Fabric 手动控制和生成作业处理代理

visual-studio-2008 - MSBuild 没有构建所有内核

c++ - Linux工具MPI调用导致瓶颈分析

c - 指向常量整数数组的指针

c - 循环打印右对齐

python - 将多个变量传递给PoolExecutor

c++ - 当接收方不发布接收时标准和非阻塞发送会发生什么