多核上的 MPI 计算比单核上的错误

修复4x

我是 MPI 的新手,并将其作为大学课程进行学习。任务是使用以数字方式找到 const e的值我找到的唯一合适的方法是MPI_Send()MPI_Recv()

在此处输入图片说明

我在 2、3 和 4 核上运行它,但得到了错误的数字,而在 1 核上一切正常。这是我的代码:

#include <iostream>
#include <fstream>
#include <cmath>
#include "mpi.h"

using namespace std;

const int n = 1e04;
double start_time, _time;
int w_size, w_rank, name_len;
char cpu_name[MPI_MAX_PROCESSOR_NAME];
ofstream fout("exp_result", std::ios_base::app | std::ios_base::out);

long double factorial(int num){
    if (num < 1)
        return 1;
    else
        return num * factorial(num - 1);
}

void e_finder(){
    long double sum = 0.0, e = 0.0;
    if(w_rank == 0)
        start_time = MPI_Wtime();

    for(int i = 0; i < n; i+=w_size)
        sum += 1.0 / factorial(i);
    MPI_Send(&sum, 1, MPI_LONG_DOUBLE, 0, 0, MPI_COMM_WORLD);

    if(w_rank == 0){
        // e += sum;
        for (int i = 0; i < w_size; i++){
            MPI_Recv(&sum, 1, MPI_LONG_DOUBLE, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            e += sum;
        }
        _time = MPI_Wtime() - start_time;
        cout.precision(29);
        cout << "e = "<< e << endl << fixed << "error is " << abs(e - M_E) << endl;
        cout.precision(9);
        cout << "\nwall clock time = " <<_time << " sec\n";
        fout << w_size << "\t" << _time << endl;
    }
}

int main(int argc, char const *argv[]) {
    MPI_Init(NULL, NULL);
    MPI_Comm_size(MPI_COMM_WORLD, &w_size);
    MPI_Comm_rank(MPI_COMM_WORLD, &w_rank);
    MPI_Get_processor_name(cpu_name, &name_len);

    cout<<"calculations started on cpu:" << w_rank << "!\n";
    MPI_Barrier(MPI_COMM_WORLD);

    e_finder();

    MPI_Finalize();
    fout.close();
    return 0;
}

有人可以帮我找出并掌握错误吗?以下是输出:

$ mpirun -np 1 ./exp1
calculations started on cpu:0!
e = 2.718281828459045235428168108
error is 0.00000000000000014463256980957

wall clock time = 4.370553009 sec



$ mpirun -np 2 ./exp1
calculations started on cpu:0!
calculations started on cpu:1!
e = 3.0861612696304875570925407846
error is 0.36787944117144246629694248618

wall clock time = 2.449338411 sec



$ mpirun -np 3 ./exp1
calculations started on cpu:0!
calculations started on cpu:1!
calculations started on cpu:2!
e = 3.5041749401277555767651727958
error is 0.78589311166871048596957449739

wall clock time = 2.011082204 sec



$ mpirun -np 4 ./exp1
calculations started on cpu:0!
calculations started on cpu:3!
calculations started on cpu:1!
calculations started on cpu:2!
e = 4.1667658813667669917037150729
error is 1.44848405290772190090811677443

wall clock time = 1.617427335 sec
斯蒂芬

问题在于你如何划分工作。似乎您希望每个程序计算分数的一部分。但是,它们都是从第一个分数开始,然后计算每个w_size分数。这会导致某些分数被多次计算,而有些分数根本不会被计算。这应该通过更改行来解决

for(int i = 0; i < n; i+=w_size)

for(int i = w_rank; i < n; i+=w_size)

这使得每个程序以不同的分数开始,并且由于它们正在计算每个w_size分数,因此计算的分数之间不应再有任何冲突。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Zynq上使用多核

来自分类Dev

OpenMP 仅检测多插槽/多核系统上的单核

来自分类Dev

多核CPU上的Redis性能

来自分类Dev

多核CPU上的Redis性能

来自分类Dev

AWS集群上的MPI

来自分类Dev

多个节点上的MPI_Bcast错误

来自分类Dev

多核系统上的C ++多线程

来自分类Dev

Ipython Notebook上的多核和多线程

来自分类Dev

多核ARM A9上的NOP

来自分类Dev

多核系统上的C ++多线程

来自分类Dev

了解多核系统上的平均负载

来自分类Dev

MPI + pthreads。程序卡在MPI_Ssend和MPI_Recv上

来自分类Dev

lsf群集上的mpi作业提交

来自分类Dev

使用Intel MPI在centos上安装Rmpi

来自分类Dev

MPI分段故障仅在多个节点上

来自分类Dev

在Linux Makefile上运行MPI程序

来自分类Dev

在多台机器上运行MPI

来自分类Dev

提升 world.iprobe 上的 MPI 崩溃

来自分类Dev

Goroutine在多核处理器上的表现如何

来自分类Dev

Node Child Process Spawn是否在多核CPU上运行?

来自分类Dev

logback isDebugEnabled()在多核CPU上运行缓慢吗?

来自分类Dev

logback isDebugEnabled()在多核CPU上运行缓慢吗?

来自分类Dev

在Ubuntu上运行具有多核的应用程序

来自分类Dev

如何让我的应用在多核上运行?

来自分类Dev

为什么 C# 线程不能在多核上运行?

来自分类Dev

单核ARM上的内存屏障

来自分类Dev

处理旋转,等待MPI-IO在MPI_File_open上同步

来自分类Dev

MPI:处理器在单个 MPI 进程上不会达到 100%

来自分类Dev

如何在MPI作业中的计算节点上设置环境变量