C++ OpenMP只创建一个线程
我使用Ubuntu编写了几行代码,但它只创建了一个线程。当我在终端上运行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
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