【问题标题】:OpenMP creates only one threadOpenMP 只创建一个线程
【发布时间】:2014-09-25 23:54:28
【问题描述】:

我使用 Ubuntu 并编写了几行代码。但它只创建一个线程。当我在终端上运行 nproc 命令时,输出为 2。我的代码如下

int nthreads, tid;

#pragma omp parallel private(tid)
{
    tid = omp_get_thread_num(); 
    printf("Thread = %d\n", tid);

    /* for only main thread */
    if (tid == 0) 
    {
        nthreads = omp_get_num_threads(); 
        printf("Number of threads = %d\n", nthreads);
    }
}  

输出:

Thread = 0
Number of threads = 1

我怎样才能做并行?

【问题讨论】:

    标签: c++ multithreading parallel-processing openmp


    【解决方案1】:

    如果您使用 gcc/g++,您必须确保使用 -fopenmp compilerlinker 选项启用 openmp 扩展。在链接期间指定它将链接到相应的库 (-lgomp)。

    用类似的东西编译:

    g++ -fopenmp myfile.c -o exec
    

    或:

    g++ -c myfile.c -fopenmp
    g++ -o exec myfile.o -fopenmp
    

    如果您忽略-fopenmp 编译选项,您的程序将编译,但它会像未使用openmp 一样运行。如果您的程序不使用omp_set_num_threads 设置线程数,则可以从命令行设置:

    OMP_NUM_THREADS=8 ./exec
    

    我认为默认值通常是特定系统上的核心数。

    【讨论】:

    • 不客气。很高兴你得到了它,我用更多细节修改了我的答案。我还提到了 OMP_NUM_THREADS 环境变量。
    • 对于 GCC,omp.h 不位于包含文件的默认搜索路径上,除非提供了 -fopenmp,因此将后者排除在外将导致编译时错误。此外,-fopenmp -lgomp 组合是多余的 - 当链接期间存在 -fopenmp 时,libgomp 会自动链接(除非显式调用链接编辑器)。
    • @HristoIliev 最新版本的 GCC omp.h 实际上包含在编译器包含目录中。在 Ubuntu 和 Debian(使用 GCC)的情况下,例如,如果您不包含 -fopenmp 但包含 omp.h,则程序将编译得很好。它只会忽略所有的 openmp 编译指示。你是对的,但当指定 -fopenmp 时 -lgomp` 是多余的。但是,如果您指定-lgomp,您的程序将编译并链接是否使用-fopenmp
    • 我会指出,并非所有编译器都以与 GCC 相同的方式处理 openmp,但是因为 OP 指定了我针对它的 Ubuntu。我没有提到 clang,因为 openmp 支持相当新,您需要一个最前沿的版本才能获得 openmp 支持。
    • 您对omp.h 的看法是正确的。尽管如此,如果程序包含对 OpenMP 运行时库的调用(即omp_get_thread_num()),除非提供-fopenmp-lgomp,否则它不会链接。因此,我不会建议某人明确提供-lgomp,因为这样做可能会掩盖编译器选项中缺少-fopenmp 的情况。此外,库的名称可能会随着未来的编译器版本而改变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2016-03-19
    相关资源
    最近更新 更多