我有一个使用第三方库的应用程序,该库依赖于OpenMP来提高性能。
我已经成功地在macOS上构建了该应用程序,并对其进行了测试,发现它可以正常运行,即如果我设置了OMP_NUM_THREADS
,则运行了正确的线程数(如Activity Monitor
和一些诊断输出语句。
问题在于,这些线程似乎在单个内核上执行,而我希望每个线程都在单独的内核上;我的处理需要占用大量CPU,并且从单个内核上的上下文切换中我将几乎得不到任何好处。
OpenMP文档建议为此使用KMP_AFFINITY
,但明确指出OS X不支持此功能。
有没有办法强迫OpenMP线程分布在多个内核上?
PS,我知道我可以使用GCD和许多其他解决方案来尝试解决此问题,但是我使用的是第三方跨平台库,因此这些选项对我而言不可行。
编辑
进一步阅读后,我设法使用OMP_DISPLAY_ENV
和OMP_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
设置为cores
,threads
和sockets
,但是相似性始终显示undefined
。这可能是问题的一部分吗?我需要以某种方式指定地点吗?