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环境变量值。
以上方法均未改变错误输出或线程分布行为。
疑问
- 为何
OMP_PLACES被忽略,libgomp声称亲和性不被支持? - 在Rcpp+OpenMP场景下,是否有强制线程-核心绑定的替代方案?
- 这是否是编译器/Rtools的限制(如缺少libgomp支持)?
内容的提问来源于stack exchange,提问作者roh
相关产品推荐
相关产品推荐

