C++ OpenMP只创建一个线程

C++ OpenMP只创建一个线程,c++,multithreading,parallel-processing,openmp,C++,Multithreading,Parallel Processing,Openmp,我使用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) { nthr

我使用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

如何实现并行性?

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

使用类似以下内容进行编译:

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

如果您省略了
-fopenmp
编译选项,您的程序将进行编译,但它将像未使用openmp一样运行。如果您的程序未使用
omp\u set\u num\u threads
设置可从命令行设置的线程数:

OMP_NUM_THREADS=8 ./exec

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

欢迎您。很高兴你成功了,我用更多的细节修改了我的答案。此外,我还提到了OMP_NUM_THREADS环境变量。使用GCC
OMP.h
时,除非提供了
-fopenmp
,否则OMP.h不位于包含文件的默认搜索路径上,因此忽略后者将导致编译时错误。另外,
-fopenmp-lgomp
组合是冗余的-
libgomp
在链接时间内出现时会自动链接(除非显式调用链接编辑器)。@hristoliev及其最新版本的GCC omp.h实际上包含在编译器include目录中。例如,在Ubuntu和Debian(使用GCC)的情况下,如果您不包括
-fopenmp
,但确实包括
omp.h
,那么程序就可以正常编译。它将忽略所有openmp pragma。但是,当指定了
-fopenmp
时,您是正确的-lgomp`是多余的。但是,如果您指定
-lgomp
,无论是否使用
-fopenmp
,您的程序都将进行编译和链接。我要指出的是,并非所有编译器都像GCC那样处理openmp,因为OP指定了我的目标Ubuntu。我没有提到clang,因为openmp支持是相当新的,您需要一个最先进的版本来获得openmp支持。关于
omp.h
,您是对的。但是,如果程序包含对OpenMP运行时库的调用(即
omp\u get\u thread\u num()
),则除非提供
-fopenmp
-lgomp
,否则程序不会链接。因此,我不建议任何人明确提供
-lgomp
,因为这样做可能会掩盖编译器选项中缺少
-fopenmp
的情况。此外,库的名称可能会随着未来的编译器版本而更改。
OMP_NUM_THREADS=8 ./exec