x872625024 2023-06-06 19:42 采纳率: 0%
浏览 20

同样的代码使用openmp在不同的程序中,加速效果差距

我使用openmp对一段代码进行并行加速,使用了32个线程,在下面代码里面测试加速了8-9倍,而把它加入到别的程序里面只有0.5倍的加速,而且还不稳定,有时候没效果。

#include <stdio.h>
#include <mpi.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
#ifdef _OPENMP
#include <omp.h>
#endif
#define NXT 256
#define NYT 128
#define NZT 128
#include <sys/time.h>
double cpuSecond()
{
    struct timeval tp;
    gettimeofday(&tp, NULL);
    return (double)tp.tv_sec + (double)tp.tv_usec * 1.e-6;
}

int main()
{
    MPI_Init(NULL, NULL);
    double *p, *u, *v, *w;
    p = (double *)malloc((NXT + 2) * (NYT + 2) * (NZT + 2) * sizeof(double));
    u = (double *)malloc((NXT + 2) * (NYT + 2) * (NZT + 2) * sizeof(double));
    v = (double *)malloc((NXT + 2) * (NYT + 2) * (NZT + 2) * sizeof(double));
    w = (double *)malloc((NXT + 2) * (NYT + 2) * (NZT + 2) * sizeof(double));
  
    double t1, t2;
    t1 = cpuSecond();
    for (int n = 0; n < NXT*NYT*NZT; ++n)
    {
        int i = n / (NYT * NZT) + 1;
        int j = (n % (NYT * NZT)) / NZT + 1;
        int k = (n % (NYT * NZT)) % NZT + 1;
        int id = i * (NYT + 2) * (NZT + 2) + j * (NZT + 2) + k;
        u[id] = 1;
        v[id] = 1;
        w[id] = 1;
        p[id] = 1;
    }
    t2 = cpuSecond();
    cout << " noomp:" << t2 - t1 << endl;
    t1 = cpuSecond();
#pragma omp parallel for
    for (int n = 0; n <  NXT*NYT*NZT; ++n)
    {
        int i = n / (NYT * NZT) + 1;
        int j = (n % (NYT * NZT)) / NZT + 1;
        int k = (n % (NYT * NZT)) % NZT + 1;
        int id = i * (NYT + 2) * (NZT + 2) + j * (NZT + 2) + k;
        u[id] = 1;
        v[id] = 1;
        w[id] = 1;
        p[id] = 1;
    }
    t2 = cpuSecond();
    cout << " omp:" << t2 - t1 << endl;
    MPI_Finalize();
    return 0;
}

下面是这个程序加速效果,另一个程序比较大,但是加速的代码段,数据规模都是一样大的。

img

  • 写回答

2条回答 默认 最新

  • 赵4老师 2023-06-08 11:17
    关注

    无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!

    评论

报告相同问题?

问题事件

  • 创建了问题 6月6日

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮