OpenMP不会运行多个线程

时间:2018-06-12 20:52:48

标签: c++ visual-studio visual-studio-2015 openmp

以下代码不会运行多个线程。我尝试了以下但没有成功(Visual Studio 2015 Update 3):

  • 启用了对OpenMP的支持(配置属性 - > C / C ++ - >语言 - >打开MP支持 - >是(/ openmp)
  • 在Visual Studio中定义了OMP_NUM_THREADS环境变量(配置属性 - >调试 - >环境 - > OMP_NUM_THREADS = 4
  • 在Windows中定义了OMP_NUM_THREADS环境变量
  • 在代码
  • 中调用omp_set_num_threads(4)
  • 尝试使用#pragma omp parallel num_threads(4)

我还没有能够获得多个帖子。

#include <iostream>
#include <omp.h>

int main(int argc, char* argv[])
{

    int nb_threads = omp_get_max_threads();
    printf(">> omp_get_max_thread()\n>> %i\n", nb_threads);

    omp_set_num_threads(4);
    printf(">> omp_set_num_threads(4)\n");

    nb_threads = omp_get_num_threads();
    printf(">> omp_get_num_threads()\n>> %i\n", nb_threads);

    int id;
    #pragma omp parallel
    {
        id = omp_get_thread_num();
        printf(">> omp_get_thread_num()\n>> %i\n", id);
    }
    return 0;
}

输出结果为:

>> omp_get_max_thread()
>> 8
>> omp_set_num_threads(4)
>> omp_get_num_threads()
>> 1
>> omp_get_thread_num()
>> 0

2 个答案:

答案 0 :(得分:2)

问题是您只有一个id,并且序列化了对它的访问权限。通过让每个线程访问自己的id,它们可以并行执行,因此我们希望将pragma更改为:

#pragma omp parallel private(id)

这样,对id的访问不是序列化的,每个线程都可以自己执行,所以我们得到这样的输出:

>> omp_get_max_thread()
>> 4
>> omp_set_num_threads(4)
>> omp_get_num_threads()
>> 1
>> omp_get_thread_num()
>> 0
>> omp_get_thread_num()
>> 3
>> omp_get_thread_num()
>> 2
>> omp_get_thread_num()
>> 1

答案 1 :(得分:0)

您应该使用编译器选项#pragma omp在源代码中启用/openmp

  

如果编译中未指定Scaffold-DbContext,编译器将忽略OpenMP子句和指令。