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

为什么OpenMP优于线程?

华良平
2023-03-14

我一直在用OpenMP调用这个

#pragma omp parallel for num_threads(totalThreads)
for(unsigned i=0; i<totalThreads; i++)
{
workOnTheseEdges(startIndex[i], endIndex[i]);
}

在C11 std::threads中(我相信这些只是pthreads)

vector<thread> threads;
for(unsigned i=0; i<totalThreads; i++)
{
threads.push_back(thread(workOnTheseEdges,startIndex[i], endIndex[i])); 
}
for (auto& thread : threads)
{
 thread.join();
}

但是,OpenMP的实现速度是原来的两倍——更快!我本以为C11线程会更快,因为它们更低级。注意:上面的代码在一个循环中不仅被调用了一次,而且可能被调用了10000次,所以这可能与此有关吗?

编辑:为了澄清,在实践中,我要么使用OpenMP,要么使用C 11版本——不是两者都使用。当我使用OpenMP代码时,需要45秒,当我使用C 11时,需要100秒。

共有2个答案

岳英锐
2023-03-14

考虑以下代码。OpenMP版本的运行时间为0秒,而C 11版本的运行时间为50秒。这不是因为函数没有,也不是因为向量在循环中。可以想象,c 11线程在每次迭代中都被创建然后销毁。另一方面,OpenMP实际上实现了线程池。它不在标准中,但在Intel和AMD的实现中。

for(int j=1; j<100000; ++j)
{
    if(algorithmToRun == 1)
    {
        vector<thread> threads;
        for(int i=0; i<16; i++)
        {
            threads.push_back(thread(doNothing));
        }
        for(auto& thread : threads) thread.join();
    }
    else if(algorithmToRun == 2)
    {
        #pragma omp parallel for num_threads(16)
        for(unsigned i=0; i<16; i++)
        {
            doNothing();
        }
    }
}
汤念
2023-03-14

在OpenMP版本中,totalThreads来自哪里?我打赌它不是startIndex。size()。

OpenMP版本将请求排队到汇总线程工作线程上。看起来C 11版本创建了start Index.size()线程,如果这是一个很大的数字,这会涉及大量的开销。

 类似资料:
  • 本文向大家介绍什么是OpenMP?,包括了什么是OpenMP?的使用技巧和注意事项,需要的朋友参考一下 OpenMP是一组编译器指令以及用于以C,C ++或FORTRAN编写的程序的API,可为共享内存环境中的并行编程提供支持。OpenMP将并行区域标识为可以并行运行的代码块。应用程序开发人员在其并行区域的代码中插入编译器指令,这些指令指示OpenMP运行时库并行执行该区域。下面的C程序在包含pr

  • 问题内容: 我在服务器上有一个网站。主页为example.com/index.php。 好的,我将一个index.html命名文件上传到服务器(根目录),当我在浏览器的URL栏中键入站点的域时,感到很惊讶,因为index.html页面已加载。 (example.com-> example.com/index.html)所以不是我想要的。 我的问题:为什么会这样?为什么index.html比inde

  • 问题内容: 我最近才发现我认为这里有些奇怪。为什么会这样,并且处于不同的优先级?我会以为他们处于同一水平。以上证明了这一点。即使从左到右的求值对第一个给出的都是假,而第二个则给出的是真,这两个陈述都是正确的。 有人知道这背后的原因吗? (顺便说一句,我只是在这里使用了很多括号,但是是旧代码提出了这个问题) 问题答案: 因为在传统的数学表示法中,(逻辑合取)的优先级高于(逻辑合取)。 出于显而易见的

  • 所以我的问题是为什么not Queue比list更受欢迎。我相信一定有某种原因,但不知何故,我错过了这种理解? 更新:-这是我明确的要求 1)加法发生在末尾,应该很快。可能是O(1) 3)由于查找将基于om索引进行,因此两者都将是O(1)

  • 问题内容: Java 线程本身实现了Java !并且根据Internet上的大多数专家的说法,首选Runnable而不是Extended Thread!即使我们没有Thread类也无法在线程意义上使用利用Runnable! 那么为什么我们宁愿实现而不是扩展,因为在两种情况下实际线程都是通过调用已实现的方法(即或)来声明的,尽管在我们不是仅通过重写方法来真正“扩展”功能的情况下? 如果我感到困惑,我

  • 下面简单脚本并行产生随机数 在使用单个线程时,上述脚本是确定性 然而,当使用多个线程时,它是部分随机,且包含线程之间的相关性(这可能是一个相当大的问题 我明白为什么我的代码不是线程安全的,但我不明白如何使它是线程安全的。是否可以不考虑线程的数量而具有确定性的输出? 目标是使产生与相同的输出(即线程数不会影响对象)。如果这不可能,则目标是产生与相同的输出。