Переопределение системных значений по умолчанию для флагов компиляции C++ из R

Я использую RcppEigen для написания некоторых функций C++ для моего кода R, и я хотел бы максимально оптимизировать их компиляцию. Когда я использовал Eigen в прошлом, я получил значительный прирост от -O3 и -fopenmp. Следуя совету Дирка, я отредактировал ~/.R/Makevars, чтобы мой код Eigen быть скомпилирован с этими флагами:

CPPFLAGS=-O3 -fopenmp

Это работает — когда я проверяю, что происходит во время компиляции (ps ax | grep cpp), я вижу:

27097 pts/6    R+     0:00 /usr/libexec/gcc/x86_64-redhat-linux/4.4.7/cc1plus -quiet -I/usr/include/R -I/home/sf/R/x86_64-redhat-linux-gnu-library/3.0/Rcpp/include -I/home/sf/R/x86_64-redhat-linux-gnu-library/3.0/RcppEigen/include -D_GNU_SOURCE -D_REENTRANT -DNDEBUG -D_FORTIFY_SOURCE=2 file69b757e053ad.cpp -quiet -dumpbase file69b757e053ad.cpp -m64 -mtune=generic -auxbase-strip file69b757e053ad.o -g -O3 -O2 -Wall -fopenmp -fpic -fexceptions -fstack-protector --param ssp-buffer-size=4 -o -

Флаги, которые я хотел, есть, -O3 и -fopenmp. Но я также вижу там -O2, который предположительно является общесистемным значением по умолчанию (я проверил это, удалив ~/.R/Makevars, и действительно, -O2 есть, а -O3 и -fopenmp нет.)

Итак, вопрос: как мне избавиться от -O2? Или это действительно имеет значение? Страница руководства g++ говорит:

   -O3 Optimize yet more.  -O3 turns on all optimizations specified by -O2 and also 
   turns on the -finline-functions, -funswitch-loops, -fpredictive-commoning, -fgcse- 
   after-reload, -ftree-vectorize and -fipa-cp-clone options.

Так что, может быть, хорошо иметь и -O2, и -O3?


person stackoverflax    schedule 24.01.2014    source источник
comment
Это нормально; gcc будет использовать самый высокий уровень оптимизации, переданный через его флаги (IIUC).   -  person Kevin Ushey    schedule 24.01.2014
comment
@KevinUshey: ты уверен? Я всегда использую крайние левые флаги? У вас есть источник для этого?   -  person user189035    schedule 02.05.2014
comment
Ах, ты прав. Из руководства -- If you use multiple -O options, with or without level numbers, the last such option is the one that is effective.. Так что похоже, что на самом деле используется самый правый.   -  person Kevin Ushey    schedule 02.05.2014


Ответы (1)


Я думаю, вам нужно CXXFLAGS, а не CPPFLAGS в вашем ~/.R/Makevars

Я установил Makevars в следующем репозитории для сравнения различных флагов компилятора C++ в R/Rcpp https://github.com/jackwasey/optimization-comparison

Я использую функцию из https://github.com/jimhester/covr, чтобы сделать это программно, если это вам пригодится.

Кроме того, вы видели следующее? R: Флаг оптимизации C++ при использовании встроенного пакета

person Jack Wasey    schedule 02.10.2015