【问题标题】:OpenACC vs OpenMPOpenACC 与 OpenMP
【发布时间】:2018-08-04 22:45:25
【问题描述】:

您好,我测试了 OpenACC 与 OpenMP 与 Nothing,但我得到了奇怪的结果。

  • 代码:

        #include <stdio.h>
            int main () {
            int a,sum=0;
       (#pragma omp for/#pragma acc parallel loop/nothing)
       for( a = 0 ; a < 2000000000; a = a + 1 ){
         sum+=a%2;
       }
     printf("sum = %d\n",sum);
       return 0;
    }
    
    1. 我使用子系统 Ubuntu for windows 10 (https://docs.microsoft.com/en-us/windows/wsl/install-win10) 和 GCC 7.1(C 编译器)并得到以下结果:Nothing = OpenMP(约 5 秒内正确结果); OpenACC 更快,但结果错误(0 vs 1 000 000 000)
    2. 我将 VMware 与 Ubuntu 一起使用,结果是:什么都没有 什么都没有(程序无限执行,我只是关闭终端);开放式ACC 显示结果比 OpenMP 更快,但再次显示错误结果。
    3. 如果我在控制台中使用带有 OpenMP 的 Intel C++ 编译器,我会得到大约 1.3 秒,而在 Ubuntu 中大约是 5 秒

怎么办?

【问题讨论】:

    标签: windows ubuntu gcc openmp openacc


    【解决方案1】:

    您有多个不同的线程覆盖sum,因此您得到了错误的结果。你需要告诉它这是一个“减少”

    #pragma omp parallel for reduction(+:sum)
    

    #pragma acc parallel loop reduction(+:sum)
    

    【讨论】:

    • 是的,这项工作我得到了大约 5 秒的正确结果,但使用英特尔 C++ 编译器和 OpenMP 我得到了 1.5 秒,我怎样才能更快?
    • 确保您在优化而不是调试模式下进行编译(-O2-O3)。确保您在 GCC (-fopenmp) 的命令行上正确指定了 OpenMP。
    • 我再次测试了 VS 和 Intel 编译器,使用 OpenMP 我可以得到 1.2 秒,没有并行化我得到 0.8 秒,wtf。
    • 我得到 0.35s 非并行,0.13s 并行。确保您测量的是实时而不是 CPU 时间(CPU 时间会增加考虑每个线程的时间,因此永远不会“更快”)。除此之外我不知道
    • 你说的是 OpenACC 还是 OpenMP?使用 #pragma omp parallel for reduction(+:sum) 我可以得到 0.28 秒。
    【解决方案2】:

    谷歌“竞争条件” 事实上,新版本的 PGI OpenACC 足够智能,可以检测给定变量的减少。这并不意味着您应该编写可能有错误的代码

    【讨论】:

      猜你喜欢
      • 2013-10-29
      • 2017-12-19
      • 2013-01-28
      • 2021-12-17
      • 2014-05-08
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      相关资源
      最近更新 更多