2017-06-13 36 views
1

在英特尔系统上使用OpenMP时,我经常发现设置KMP_AFFINITY=verbose,(other options...)是非常有用的,因此库会分配我的线程实际绑定到的内核。在尝试使用不同的线程绑定选项时,我发现这很有帮助。目前我正在使用Power8系统,并且想知道GNU和/或IBM OpenMP发行版是否有相当于KMP_AFFINITY=verbose的版本。换句话说,如果我用g ++或xlC++编译我的OpenMP可执行文件,如何获得有关我的线程放置位置的信息?等效的KMP_AFFINITY =冗长的gnu和ibm openmp库?

+0

Libgomp不支持对诸如Windows等目标进行关联。对于像Linux这样的目标,英特尔openmp支持gcc openmp调用,这将是一种完成你所要求的方法。 – tim18

回答

1

GCC OpenMP documentation(libgomp)说,这是目前不可能的:

没有libgomp库例行程序来确定CPU亲和力规范是否有效。作为解决方法,语言特定的库函数(例如C中的getenv或Fortran中的GET_ENVIRONMENT_VARIABLE)可用于查询GOMP_CPU_AFFINITY环境变量的设置。启动时定义的CPU亲和性在应用程序的运行时期间不能更改或禁用。

您可以尝试使用GOMP_DEBUG并查看它是否符合您的要求。

+0

'OMP_DISPLAY_ENV = VERBOSE'确实会导致'GOMP_CPU_AFFINITY'被打印出来,但即使我明确设置了OMP_PLACES,它也显示为空('GOMP_CPU_AFFINITY =''')。 'export GOMP_DEBUG = 1'不会向输出添加任何东西。我不确定我是否做错了什么,或者我正在使用一个不太健谈的libgomp版本。 –

+0

它可能会打印设置内部控制变量(ICV)的环境变量的值。如果您设置了'GOMP_CPU_AFFINITY',它可能会打印该值。另一种可能性是为自己编写一个打印它的函数。我已经使用了[sched_getaffinity](https://linux.die.net/man/2/sched_getaffinity)。你可以检查这个[有用的例子](https://github.com/karelzak/util-linux/blob/143ea06851104ffaa9d3fe8de09c721d2364de64/lib/cpuset.c#L150)。也许你甚至可以向libgomp提交一个补丁来做你正在寻找的东西。 –

+0

谢谢。我希望有一个像KMP_AFFINITY一样快速和完整的解决方案,但至少这为我提供了一些工具。 –

1

使用xlC++,可以将OMP_DISPLAY_ENV环境变量设置为TRUE或VERBOSE以获取此信息。全部细节可在IBM Knowledge Center上找到。

+0

谢谢你的回复。我已经尝试过OMP_DISPLAY_ENV。输出显示环境变量值,包括OMP_PLACES。然而,它似乎并没有告诉我每个线程最终绑定到哪个核心,KMP_AFFINITY的做法,除非我失去了一些东西。我的目标是查看由给定的环境变量组合产生的线程位置,因此了解环境变量本身并不会有帮助。 –

+0

不幸的是,xlC++没有像KMP_AFFINITY = verbose那样方便,但是如果您愿意修改代码并尝试xlC++中的未公开功能,则会有一个函数_xlsmp_thread_binding(),它将打印出CPU亲和性调用线程。由于它没有官方支持,它可能不适合你,但它可能值得一试。 – trudeaun

+0

谢谢,我会尝试。 –