首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >OpenMP不会运行超过一个线程

OpenMP不会运行超过一个线程
EN

Stack Overflow用户
提问于 2018-06-13 04:52:48
回答 1查看 3.9K关注 0票数 2

下面的代码不会运行超过一个线程。我尝试了以下方法,但没有成功(Visual Studio 2015 Update 3):

  • 启用了对OpenMP的支持(Configuration Properties -> C/C++ -> Language -> Open MP support ->是使用Visual Studio中的OMP_NUM_THREADS环境变量(Configuration Properties -> using -> environment -> -> omp_set_num_threads(4) in the code

tried #pragma parallel

我不能得到一个以上的线程。

#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
EN

回答 1

Stack Overflow用户

发布于 2018-06-13 05:09:43

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

#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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50825676

复制
相关文章

相似问题

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