You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rcpp包中OpenMP线程亲和性失效:提示配置不支持亲和性

关于Rcpp+OpenMP线程亲和性配置的问题

问题背景

我正在开发基于Rcpp与OpenMP实现并行化的R包,当前遇到线程在CPU核心间随机分布、常集中于单个核心调度的问题。为控制线程部署,尝试设置OMP_PLACES='CORES'及其他相关参数,但通过devtools::load_all(recompile = TRUE)编译安装包时,出现亲和性不支持的提示,且OMP_PLACES始终为空。

错误与环境输出

编译时的提示:

libgomp: Affinity not supported on this configuration

OpenMP环境输出显示OMP_PLACES为空:

OPENMP DISPLAY ENVIRONMENT BEGIN
  _OPENMP = '201511'
  ...
  [host] OMP_PLACES = ''  # ← Remains empty
  [host] OMP_PROC_BIND = 'CLOSE'
  ...
OPENMP DISPLAY ENVIRONMENT END

完整编译与运行输出:

! i Re-compiling awesome (debug build)
── R CMD INSTALL ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────  installing *source* package 'awesome' ...
   ** using staged installation
   ** libs
   using C++ compiler: 'G__~1.EXE (GCC) 13.3.0'
   rm -f awesome.dll RcppExports.o awesome.o misc.o
   g++ -std=gnu++17  -I"C:/PROGRA~1/R/R-44~1.3/include" -DNDEBUG  -I'C:/Users/dev/AppData/Local/R/win-library/4.4/Rcpp/include'   -I"C:/rtools44/x86_64-w64-mingw32se2 -mstackrealign  -UNDEBUG -Wall -pedantic -g -O0 -fdiagnostics-color=always -c RcppExports.cpp -o RcppExports.o
   g++ -std=gnu++17  -I"C:/PROGRA~1/R/R-44~1.3/include" -DNDEBUG  -I'C:/Users/dev/AppData/Local/R/win-library/4.4/Rcpp/include'   -I"C:/rtools44/x86_64-w64-mingw32se2 -mstackrealign  -UNDEBUG -Wall -pedantic -g -O0 -fdiagnostics-color=always -c awesome.cpp -o awesome.o
   awesome.cpp:13:35: note: '#pragma message: OpenMP available'
      13 | #pragma message("OpenMP available")
         |                                   ^
   g++ -std=gnu++17  -I"C:/PROGRA~1/R/R-44~1.3/include" -DNDEBUG  -I'C:/Users/dev/AppData/Local/R/win-library/4.4/Rcpp/include'   -I"C:/rtools44/x86_64-w64-mingw32se2 -mstackrealign  -UNDEBUG -Wall -pedantic -g -O0 -fdiagnostics-color=always -c misc.cpp -o misc.o
   g++ -std=gnu++17 -shared -static-libgcc -o awesome.dll tmp.def RcppExports.o awesome.o misc.o -fopenmp -LC:/rtools44/x86_64-w64-mingw32.static.posix/lib/x64 -LC/bin/x64 -lR
   installing to C:/Users/dev/AppData/Local/Temp/Rtmpe6ja4C/devtools_install_8e7449f3c08/00LOCK-awesome-2025/00new/awesome/libs/x64
─  DONE (awesome)

libgomp: Affinity not supported on this configuration

OPENMP DISPLAY ENVIRONMENT BEGIN
  _OPENMP = '201511'
  [host] OMP_DYNAMIC = 'FALSE'
  [host] OMP_NESTED = 'FALSE'
  [host] OMP_NUM_THREADS = '1'
  [host] OMP_SCHEDULE = 'DYNAMIC'
  [host] OMP_PROC_BIND = 'CLOSE'
  [host] OMP_PLACES = ''
  [host] OMP_STACKSIZE = '0'
  [host] OMP_WAIT_POLICY = 'PASSIVE'
  [host] OMP_THREAD_LIMIT = '4294967295'
  [host] OMP_MAX_ACTIVE_LEVELS = '1'
  [host] OMP_NUM_TEAMS = '0'
  [host] OMP_TEAMS_THREAD_LIMIT = '0'
  [all] OMP_CANCELLATION = 'FALSE'
  [all] OMP_DEFAULT_DEVICE = '0'
  [all] OMP_MAX_TASK_PRIORITY = '0'
  [all] OMP_DISPLAY_AFFINITY = 'FALSE'
  [host] OMP_AFFINITY_FORMAT = 'level %L thread %i affinity %A'
  [host] OMP_ALLOCATOR = 'omp_default_mem_alloc'
  [all] OMP_TARGET_OFFLOAD = 'DEFAULT'
OPENMP DISPLAY ENVIRONMENT END
Loading required package: raster
Loading required package: sp

系统详情

  • 操作系统:Windows
  • R版本:4.4.0
  • 编译器:GCC 13.3.0
  • Rcpp版本:1.0.14

已尝试的解决方法

  • 编译前在R中通过Sys.setenv()设置OMP_PLACES和OMP_PROC_BIND;
  • 启动shell编译前通过系统变量设置上述两个参数;
  • 通过Makevars.win和Makevars配置:
PKG_CPPFLAGS = -DOMP_PLACES=cores -DOMP_PROC_BIND=close
PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS)
PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS)
  • 测试threads、cores、sockets等不同OpenMP环境变量值。

以上方法均未改变错误输出或线程分布行为。

疑问

  1. 为何OMP_PLACES被忽略,libgomp声称亲和性不被支持?
  2. 在Rcpp+OpenMP场景下,是否有强制线程-核心绑定的替代方案?
  3. 这是否是编译器/Rtools的限制(如缺少libgomp支持)?

内容的提问来源于stack exchange,提问作者roh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 08:49:52