我是否需要在单核计算机上显式禁用OpenMP? 我用OpenMP并行化了一些C++代码。 但是如果我的程序能在单核机器上运行呢
我是否需要在运行时禁用使用线程:我是否需要在单核计算机上显式禁用OpenMP? 我用OpenMP并行化了一些C++代码。 但是如果我的程序能在单核机器上运行呢,c++,multithreading,optimization,openmp,C++,Multithreading,Optimization,Openmp,我是否需要在运行时禁用使用线程: 检查核心 如果核心>1,则使用OpenMP 否则忽略OpenMP开发 如果是,OpenMP是否有专门的指令?我相信有一个函数叫做: omp_get_num_procs() 这将让您知道有多少处理器可供OpenMP使用。然后有很多方法可以禁用OpenMP。从代码中,您可以运行: omp_set_num_threads(1) 请记住,即使在单核上,您也可以通过OpenMP获得一些提升。这只取决于您的具体情况。不,您不需要禁用OpenMP或线程以在一个内核上运行;
如果是,OpenMP是否有专门的指令?我相信有一个函数叫做:
omp_get_num_procs()
这将让您知道有多少处理器可供OpenMP使用。然后有很多方法可以禁用OpenMP。从代码中,您可以运行:
omp_set_num_threads(1)
请记住,即使在单核上,您也可以通过OpenMP获得一些提升。这只取决于您的具体情况。不,您不需要禁用OpenMP或线程以在一个内核上运行;对于可能需要的情况,最好在没有OpenMP的情况下显式重新编译,尽管对于复杂的并行化,您也可以采取其他措施,如注释中所述
当在单个内核甚至硬件线程上运行时,即使您什么都不更改(甚至不更改代码启动的线程数),正确的、无死锁的线程代码仍应正确运行,因为操作系统会在内核上调度各种线程
现在,线程之间的上下文切换开销很大。典型的OpenMP代码是计算绑定的,依赖于在线程之间分配工作,它将线程数视为一个参数,并在有可用内核或硬件线程时启动尽可能多的线程。对于这样的代码,您只需使用以下结构
#pragma omp parallel for
for (i=0; i<N; i++)
data[i] = expensive_function(i)
但是现在在没有OpenMP的情况下进行编译变得更加复杂
总结:
- 对于大型繁重的计算工作(OpenMP通常用于此),这可能无关紧要;使用OMP_NUM_THREADS=1
- 通过在不使用OpenMP的情况下进行编译,并将串行运行时与单线程OpenMP运行时进行比较,您可以在开销和禁用优化的情况下测试它是否重要
- 对于更复杂的线程情况,一般来说很难说得太多;视情况而定
#pragma omp parallel for schedule(静态)if(标量表达式)
nThreadMax = imp_get_max_threads();
#pragma omp parallel if (nThreadMax > 1)
if (omp_in_parallel()) {
// Parallel code path
} else {
// Serial code path
}