当前位置: 首页 > 知识库问答 >
问题:

OpenMP程序比顺序程序慢

有骏奇
2023-03-14

当我尝试以下代码时

double start = omp_get_wtime();

long i;

#pragma omp parallel for
    for (i = 0; i <= 1000000000; i++) {
        double x = rand();
    }

    double end = omp_get_wtime();

    printf("%f\n", end - start);

我还是并行编程的新手。我怎么能得到一个并行版本比顺序版本更快?

共有1个答案

濮阳宜
2023-03-14

随机数生成器rand(3)使用全局状态变量(隐藏在(g)libc实现中)。从多个线程访问它们会导致缓存问题,而且也不是线程安全的。您应该使用RAND_R(3)调用,并使用线程专用的seed参数:

long i;
unsigned seed;

#pragma omp parallel private(seed)
{
    // Initialise the random number generator with different seed in each thread
    // The following constants are chosen arbitrarily... use something more sensible
    seed = 25234 + 17*omp_get_thread_num();
    #pragma omp for
    for (i = 0; i <= 1000000000; i++) {
       double x = rand_r(&seed);
    }
}

请注意,并行执行时将产生不同于串行执行时的随机数流。我还推荐erand48(3)作为更好的(伪)随机数源。

 类似资料:
  • 从程序流程的角度来看,程序可以分为三种基本结构, 即顺序结构、分支结构、循环结构。 这三种基本结构可以组成所有的各种复杂程序。C语言提供了多种语句来实现这些程序结构。 本章介绍这些基本语句及其在顺序结构中的应用,使读者对C程序有一个初步的认识, 为后面各章的学习打下基础。 4.1 C语句概述 C程序的执行部分是由语句组成的。 程序的功能也是由执行语句实现的,C语句可分为以下五类: 表达式语句 函数

  • 我正在使用Spring Security 4.0.1,并希望使用多个身份验证提供程序使用基于Java的配置进行身份验证。如何指定提供程序顺序? 我希望使用AuthenticationManagerBuilder,因为这就是<code>WebSecurityConfigurerAdapter。configureGlobal()公开,但我看不到任何指定顺序的方法。我需要手动创建ProviderMana

  • 3.1 什么是Blockly语言  2012年6月,Google发布了完全可视化的编程语言Google Blockly,整个界面清晰明了, 你可以如同在玩拼图一样用一块块图形对象构建出应用程序。每个图形对象都是代码块,你可以将它们拼接起来,创造出简单功能,然后将一个个简单功能组合起来,构建出一个程序。这个程序与我们平时使用的编程语言最大的差别是无需自己编写代码,在我们所使用的代码块的背后就是已经编

  • 问题内容: 您将如何依次执行三个线程?例如。线程1,线程2,线程3。不可能将一个线程的引用传递给另一个线程并从run()方法调用。 因此代码应如下所示: 并应该把 这可以通过使用ThreadPoolExecutor并使用阻塞队列来实现,但即使那样也不是可以接受的答案。 问题答案: 在java.util.concurrent包中使用ExecutorService。更精确地使用

  • 问题内容: 我正在寻找一种将Java反向工程为序列图的工具,但BUT还提供了过滤出对某些库的调用的功能。 例如,Netbeans IDE在这方面做得很出色,但它包含对String或Integer的所有调用,这些调用使图表混乱到无法使用的地步。 任何帮助是极大的赞赏!!!!!!! 问题答案: 我认为jtracert是您想要的。它从正在运行的Java程序生成序列图。同样,由于其输出是图表的文本描述(采

  • 问题内容: 情况 在Django REST Framework的验证中工作时,我注意到字段总是被验证,即使这样做不一定有意义。以以下示例进行模型的序列化: 我有一个创建用户的端点。因此,有一个领域和一个领域。如果两个字段不匹配,则无法创建用户。同样,如果所请求的已经存在,则无法创建用户。 用户为上述每个字段发布了不正确的值 已在序列化程序中实现的实现(请参见下文),以捕获不匹配和字段 实施: 问题