如何在MacOS上使用OpenMP程序来使用多个内核

时间:2019-10-16 01:10:40

标签: macos parallel-processing openmp

我有一个使用第三方库的应用程序,该库依赖于OpenMP来提高性能。

我已经成功地在macOS上构建了该应用程序,并对其进行了测试,发现它可以正常运行,即如果我设置了OMP_NUM_THREADS,则运行了正确的线程数(如Activity Monitor和一些诊断输出语句。

问题在于,这些线程似乎在单个内核上执行,而我希望每个线程都在单独的内核上;我的处理需要占用大量CPU,并且从单个内核上的上下文切换中我将几乎得不到任何好处。

OpenMP文档建议为此使用KMP_AFFINITY,但明确指出OS X不支持此功能。

有没有办法强迫OpenMP线程分布在多个内核上?

PS,我知道我可以使用GCD和许多其他解决方案来尝试解决此问题,但是我使用的是第三方跨平台库,因此这些选项对我而言不可行。

编辑

进一步阅读后,我设法使用OMP_DISPLAY_ENVOMP_DISPLAY_AFFINITY提取更多信息,如下所示。

OMP_NUM_THREADS=4 OMP_PLACES=cores OMP_PROC_BIND=spread  OMP_DISPLAY_AFFINITY=true OMP_DISPLAY_ENV=true  ../bin/my_app

OPENMP DISPLAY ENVIRONMENT BEGIN
   _OPENMP='201611'
  [host] OMP_AFFINITY_FORMAT='OMP: pid %P tid %i thread %n bound to OS proc set {%A}'
  [host] OMP_ALLOCATOR='omp_default_mem_alloc'
  [host] OMP_CANCELLATION='FALSE'
  [host] OMP_DEFAULT_DEVICE='0'
  [host] OMP_DISPLAY_AFFINITY='TRUE'
  [host] OMP_DISPLAY_ENV='TRUE'
  [host] OMP_DYNAMIC='FALSE'
  [host] OMP_MAX_ACTIVE_LEVELS='1'
  [host] OMP_MAX_TASK_PRIORITY='0'
  [host] OMP_NESTED: deprecated; max-active-levels-var=1
  [host] OMP_NUM_THREADS='4'
  [host] OMP_PROC_BIND='spread'
  [host] OMP_SCHEDULE='static'
  [host] OMP_STACKSIZE='8M'
  [host] OMP_TARGET_OFFLOAD=DEFAULT
  [host] OMP_THREAD_LIMIT='2147483647'
  [host] OMP_TOOL='enabled'
  [host] OMP_TOOL_LIBRARIES: value is not defined
  [host] OMP_WAIT_POLICY='PASSIVE'
OPENMP DISPLAY ENVIRONMENT END


OMP: pid 6686 tid 2795865 thread 0 bound to OS proc set {undefined}
OMP: pid 6686 tid 2795867 thread 1 bound to OS proc set {undefined}
OMP: pid 6686 tid 2795868 thread 2 bound to OS proc set {undefined}
OMP: pid 6686 tid 2795869 thread 3 bound to OS proc set {undefined}

我已经尝试将OMP_PLACES设置为coresthreadssockets,但是相似性始终显示undefined。这可能是问题的一部分吗?我需要以某种方式指定地点吗?

0 个答案:

没有答案