【问题标题】:c++ omp, compare parameter and constantc++ omp,比较参数和常量
【发布时间】:2013-12-01 01:12:41
【问题描述】:

例如,我有一个函数:

void function(int x, int y)
{
 code here;
}

与我使用常量替换给定的x和y相比,传入参数时速度要慢得多。

那么,即使我使用变量 x 和 y,我如何才能获得与使用常量一样快的速度呢?

(代码中主要有一些核心的for循环) 我尝试为代码中的每个循环#pragma omp parallel for firstprivate(x, y),我得到了加速,但仍然没有我使用常量那么快,有什么建议吗? 或者,有什么方法可以将传入的 x 和 y 视为两个常量?

【问题讨论】:

  • 如果你传入的值是const,那么通过const引用传递?
  • 我传入的值是两个整数(int)

标签: c++ parameters arguments constants openmp


【解决方案1】:

我认为这样做:

pragma omp parallel for firstprivate(x, y)

您实际上是在每个内核上运行相同的 for 循环,因为这些值对每个线程都是私有的,因此它们并没有真正协同工作以更快地完成工作,最终完全适得其反。尝试使用“shared”并添加同步子句,在这种情况下为屏障。

例如:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int x = 0;
    int y = 0;
    #pragma omp parallel shared(x, y) 
    {
        #pragma omp barrier
        for(x = 0, y = 0; x <= 500000; x++, y++) {
            printf("x: %d, y: %d\n", x, y);
        }
    }
    return 0;
}

反对这个

#include <stdio.h>

int main(int argc, char *argv[])
{
    int x = 0;
    int y = 0;
    #pragma omp parallel firstprivate(x, y) 
    {
        #pragma omp barrier
        for(x = 0, y = 0; x <= 500000; x++, y++) {
            printf("x: %d, y: %d\n", x, y);
        }
    }
    return 0;
}

我不认为我有你的完整答案,因为我自己还在玩弄它,但希望它有助于找到一个。

wikipedia 上的“OpenMP”文章看起来非常好,我仍在阅读并理解这一切...

【讨论】:

  • @user2786737 没问题。也来自 wiki:目前仅在共享内存多处理器平台上有效运行(但请参见 Intel 的 Cluster OpenMP 和其他分布式共享内存平台)。我一直在尝试使用 OpenMP 获得更好的性能,但看起来我不会得到它,因为我没有多个处理器。如果你得到结果,请告诉我。
猜你喜欢
  • 2011-08-25
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
相关资源
最近更新 更多