2017-04-04 19 views
0

Rcpp 및 RcppEigen을 통해 C++ 코드를 호출하는 R 패키지를 개발했습니다. 내 Makevars.winWindows/Mac에서 R 패키지의 C++ 컴파일 플래그

  1. CXX_STD = CXX11

  2. PKG_CPPFLAGS = -fopenmp -03 -Wall -ftree - 벡터 라이 -march = 기본 -mavx을 (열거 형은 내 질문을 참조하는 것을 의미한다)과 같다 - mfma

  3. PKG_CXXFLAGS + = $ (SHLIB_OPENMP_CXXFLAGS)

  4. PKG_LIBS = -fopenmp

  5. PKG_LIBS + = $ (LAPACK_LIBS) $ (BLAS_LIBS) $ (FLIBS) $ (SHLIB_OPENMP_CXXFLAGS) 내가 사용하기 원하는

  6. PKG_CPPFLAGS가 + = -I ../ INST//

포함 OpenMP 및 R 패키지를 인텔 MKL 라이브러리에 연결합니다. 또한 내 소스 파일에 플러그인 // [[Rcpp::plugins(cpp11)]]// [[Rcpp::plugins(openmp)]]을 추가하고 있습니다.

패키지를 컴파일해도 문제가 없지만 여전히 기본 컴파일 플래그 -O2-std=c++0x을 얻고 있습니다. 그래서 내 질문은 다음과 같습니다.

대답은 1.(그런데, 동일한 Makevars를 사용하면 올바른 C++ 버전을 생성하므로 Windows에만 한정된 것이어야합니다) A. 강제되지 않습니까?

B. B. 3에서 fopenmp가 3 번 반복됩니까?

C. 5. 여부를 확인하는 방법? 나는 Mac에서 빌드 된 동일한 패키지가 Windows보다 훨씬 빠르며 구성도 동일하지만이 질문을하고 있습니다. 필자는 Microsoft R Open 및 Mac을 사용하여 Windows에서 동일한 코드의 일부 벤치 마크를 수행했으며 Windows는이 경우 더 빠릅니다.

매우 소중한 도움에 감사드립니다.

답변

1

어디서부터 시작해야할까요?

우선, 컴파일 및 링크 옵션이 R의 Makeconf조합하고 패키지의 src/Makevars을 기반으로합니다. 가치에 더할 수는 있지만 대체 할 수는 없습니다.

둘째, 관련 BLAS는 시스템 설정 문제입니다. 일반적으로 패키지에서 관리 할 수는 없습니다.

세 번째로 sourceCpp()cppFunction()의 플러그인. 패키지에서는 직접 선언을합니다 (예 : CXX_STD=CXX11).

넷째, Rcpp를 사용하는 CRAN에는 거의 1000 개의 패키지가 있습니다. 때로는 이들 중 일부가 무엇을하는지 보는 데 도움이되는 경우도 있습니다. 많은 사람들이 OpenMP를 사용합니다.

다섯째, OpenMP는 Apple 덕분에 OS X에서 심하게 어려움을 겪고 있습니다. Windows 상황이 무엇인지 잊어 버렸습니다. 그것 그냥 리눅스에서 작동합니다.

+0

Windows에서만 작동합니다 ... macOS에만 특수 처리가 필요합니다. – coatless

+0

설명해 주셔서 감사합니다. 감사합니다. –

+0

@DirkEddelbuettel 내가 들었던 것처럼 들리는데 ... 그 플래그가 내 src/Makevars에 있는데 R 패키지를 만드는 데 사용되었다는 것과 그 CXX_STD = CXX11은 Windows에서는 고려되지 않았지만 Mac에 있다는 것을 알립니다. 이유는 분명하지 않습니다. 그렇다면 분명히 OpenMP를 사용하여 패키지를 살펴 보았습니다. 마지막으로, 패키지가 openmp를 사용하여 Windows에서 제대로 빌드되었다고 말하면서 분명하다고 생각했습니다. 내 질문은 내 플래그가 정확하고 중복되지 않는지, 그리고 std = C++ 11 및 -O3이 Windows에서 고려되지 않은 이유 (Mac에 있음)와 관련이 있습니다. – itQ