使用OpenMP在两个核心上设置线程亲和性

3
我正在使用一个C程序,在Windows 7上使用OpenMP 4.0编译gcc 4.9.2。 我的计算机是双核的,有四个线程。 我想使用线程亲和力扩展并使用2个线程放在不同的核心上。所以当我使用DOS设置环境变量时:
  • set OMP_NUM_THREADS=2
  • set OMP_PROC_BIND=spread
  • set OMP_PLACES="cores"
通过OMP_DISPLAY_ENV=true变量,我得到了以下结果:
libgomp: Invalid value for environment variable OMP_PLACES

OPENMP DISPLAY ENVIRONMENT BEGIN
  _OPENMP = '201307'
  OMP_DYNAMIC = 'FALSE'
  OMP_NESTED = 'FALSE'
  OMP_NUM_THREADS = '2'
  OMP_SCHEDULE = 'DYNAMIC'
  OMP_PROC_BIND = 'SPREAD'
  OMP_PLACES = ''
  OMP_STACKSIZE = '12872703'
  OMP_WAIT_POLICY = 'PASSIVE'
  OMP_THREAD_LIMIT = '4294967295'
  OMP_MAX_ACTIVE_LEVELS = '2147483647'
  OMP_CANCELLATION = 'FALSE'
  OMP_DEFAULT_DEVICE = '0'
OPENMP DISPLAY ENVIRONMENT END

看起来输入无效,所以我将其更改为:

  • 设置 OMP_PLACES="cores"
  libgomp: Affinity not supported on this configuration 
  OPENMP DISPLAY ENVIRONMENT BEGIN
  _OPENMP = '201307'
  OMP_DYNAMIC = 'FALSE'
  OMP_NESTED = 'FALSE'
  OMP_NUM_THREADS = '2'
  OMP_SCHEDULE = 'DYNAMIC'
  OMP_PROC_BIND = 'SPREAD'
  OMP_PLACES = ''
  OMP_STACKSIZE = '3107827'
  OMP_WAIT_POLICY = 'PASSIVE'
  OMP_THREAD_LIMIT = '4294967295'
  OMP_MAX_ACTIVE_LEVELS = '2147483647'
  OMP_CANCELLATION = 'FALSE'
  OMP_DEFAULT_DEVICE = '0'
  OPENMP DISPLAY ENVIRONMENT END

这是结果:不支持亲和性。即使使用以下命令,我仍然得到相同的结果:

set OMP_PLACES="{0},{2},{1},{3}"

你们中有人知道如何解决这个问题吗?

1个回答

2

我尝试了一个在Linux上用gcc 4.9.3编译的简单hello world代码,并使用你提供的环境变量:

~/tmp$ OMP_DISPLAY_ENV=true OMP_NUM_THREADS=2 OMP_PROC_BIND=spread OMP_PLACES=cores ./a.out 

OPENMP DISPLAY ENVIRONMENT BEGIN
  _OPENMP = '201307'
  OMP_DYNAMIC = 'FALSE'
  OMP_NESTED = 'FALSE'
  OMP_NUM_THREADS = '2'
  OMP_SCHEDULE = 'DYNAMIC'
  OMP_PROC_BIND = 'SPREAD'
  OMP_PLACES = '{0:2},{2:2}'
  OMP_STACKSIZE = '140736864318339'
  OMP_WAIT_POLICY = 'PASSIVE'
  OMP_THREAD_LIMIT = '4294967295'
  OMP_MAX_ACTIVE_LEVELS = '2147483647'
  OMP_CANCELLATION = 'FALSE'
  OMP_DEFAULT_DEVICE = '0'
OPENMP DISPLAY ENVIRONMENT END
Hello from thread 0 / 2
Hello from thread 1 / 2

基本上,这对我有效,并且我相信你尝试的方法是合法的。但是,你收到的“此配置不支持Affinity”消息让我相信,可能在你的Windows 7机器上没有可用的亲和力(Affinity)。我没有这样的测试环境,但OpenMP标准规定:
“是否可以满足亲和力请求的确定是实现定义的。如果亲和力请求无法满足,则团队中的线程的亲和力是实现定义的。”
我想我们就在这里...

嗨,Gilles。我已经在Ubuntu上使用相同的配置进行了测试,并且同意你的看法。不幸的是,我必须在Win7上使用我的应用程序,并且我想发现在gcc版本4.9.2和版本4.9.3之间使用OpenMP是否有任何差异。我会让你知道的。 - Franktrt
嗨,Gilles。我使用gcc版本5.1在Windows7上测试了我的应用程序,得到了相同的结果。因此,我最终会说,在Windows 7机器上不支持OpenMP线程亲和力。 - Franktrt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接