首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >openmp工作怪异(作业乘以物理核数)

openmp工作怪异(作业乘以物理核数)
EN

Stack Overflow用户
提问于 2021-06-17 01:49:56
回答 2查看 131关注 0票数 0

这是我的测试代码

代码语言:javascript
复制
void test_code() {
  omp_set_num_threads(4);
  #pragma omp parallel
  {
    int tid = omp_get_thread_num();

    #pragma omp for
    for (int i = 0; i < 4; i++)
      printf("Hello World %d %d\n", tid, i);
  }
}
...
void CResizer::ThreadMain()
{
  test_code();

  MLINFO(ObjectName(), "%s started\n", __FUNCTION__);
  CBufferMonitor bufResize("Resizer (frames):", ObjectId());    
  ...

结果应该是

你好世界1 1你好世界3 3你好世界2 2世界0 0

但我的结果是

你好世界0 0 1你好世界0 1你好世界0 2你好世界0 0 1世界0 2你好世界0 2你好世界0 3你好世界0 0 2世界0 3你好世界0 0 0世界0 0 3世界0 0世界0 0 0世界0 0 0世界0 0 0世界0 0 01世界0 2你好世界0 3你好世界0 2你好世界0 3

你知道为什么会这样吗?我的系统有8个核心cpu,centos 7.5。

EN

回答 2

Stack Overflow用户

发布于 2021-06-19 03:18:29

首先,我想强调的是,您提供的信息(代码示例)不足以回答这个问题,但是猜测正在发生什么是可能的。

我认为唯一可能的解释是,#pragma omp parallel区域在test_code()函数中只能使用一个线程(例如,因为没有更多可用的线程,或者您的代码位于嵌套并行区域内,并且不允许嵌套并行),因此tid始终是0。此外,test_code() (即CResizer::ThreadMain())由8个线程执行,因此打印输出重复了8次。基于您的函数名(ThreadMain),这似乎是一个合理的解释,但正如我所提到的,如果没有一个最小的工作示例,就不可能确切地说明这一点。不管怎么说,我希望这能帮你找到问题。

为了给出一个例子,下面的代码将产生类似于您发送的输出:

代码语言:javascript
复制
#include <stdio.h>
#include <omp.h>
    
void test_code() {
  omp_set_num_threads(4);
  #pragma omp parallel
  {
    int tid = omp_get_thread_num();

    #pragma omp for
    for (int i = 0; i < 4; i++)
      printf("Hello World %d %d\n", tid, i);
  }
}
int main() {    
    #pragma omp parallel
    test_code();
}
票数 0
EN

Stack Overflow用户

发布于 2021-06-17 07:24:35

查看OpenMP快速参考卡,您创建了“一个执行该区域的OpenMP线程团队”。所有的OpenMP规范都可以找到这里

即使您多次执行并行部分,输出仍然看起来是错误的。这是因为i是跨所有线程共享的。此外,还不清楚为什么要用std::mutex包围一个并行部分,该部分将其标识为C++代码。您还可以从#pragma语句中设置并行部分中的线程数。因此,以下可能就足够了:

代码语言:javascript
复制
#pragma omp parallel
{
    const int tid = omp_get_thread_num();

    #pragma omp for
    for (int i = 0; i < 4; i++)
        printf("Hello World %d %d\n", tid, i);
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68011894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档