【问题标题】:OMP Serial vs Parallel Riemann ZetaOMP 串行与并行黎曼 Zeta
【发布时间】:2016-01-26 21:17:41
【问题描述】:

我一直在尝试学习如何在 c++ 中使用 OpenMP,但在尝试将其应用于使用 Riemann Zeta 函数的代码时,我非常头疼,我只是以这种方式找到了它(在代码中),但是如果你运行它,你会发现串行过程要快得多。谁能帮我找出为什么串行比并行快?

    double rzfParallel(int n, long inf)
    {
        double sum = 0.0;
        #pragma omp parallel for reduction(+:sum) num_threads(8)
            for(int k = 1; k <= inf; k++)
                sum += 1.0/pow(k, (double)n);

        return sum;
    }


   The method to chath time:
   startTime = clock();
   funcResult = rzfParallel(n, inf);
   endTime = clock();
   timeResult = (endTime/CLOCKS_PER_SEC) -(startTime/CLOCKS_PER_SEC);

【问题讨论】:

  • 请不要发布到场外代码的链接。它使这个问题对未来毫无用处。面对这种情况,我们的模组不得不关闭和删除。
  • 好的,我怎样才能把我的代码以更好的方式来完成我的问题?
  • 将代码的最小工作部分复制并粘贴到问题本身中,缩进 4 个空格,以便本网站将其视为代码而不是文本。
  • 另外,从技术上讲,您的#pragma 声明是正确的。但是,正如@MSalters 所指出的,每个线程所做的工作很少,因此您不太可能看到整体加速。此外,当您应该使用omp_get_wtime() 时,您正在使用clock() 来衡量代码的完成时间。一个测量 CPU 时间(不是您关心的),而另一个测量程序的实际运行时间(您正在寻找的时间)。

标签: c++ parallel-processing openmp icc


【解决方案1】:

通常:盯着并行线程的时间太多,每个线程的工作太少。

【讨论】:

  • 谢谢,现在我不在我的电脑上测试。实际入口是1bi。 “#pragma”命令正确吗?
【解决方案2】:

我在英特尔编译器中使用标志 -mavx 解决了这个问题。我试图理解这个问题,但还不确定。我的处理器没有矢量化的东西。仍然无法获得-vec-report。如果有人知道怎么做,请告诉我。特别感谢 NoseKnowsAll

【讨论】:

    猜你喜欢
    • 2010-11-29
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    相关资源
    最近更新 更多