2016-08-31 7 views
3

컴파일 할 때 사용할 수있는 MKL 버전에 따라포트란 코드의 다른 라이브러리 (Intel Fortran 컴파일러도 사용하고 있습니다)를 사용하고 싶습니다. 버전 번호에 대한 처리기 매크로를 정의하고 날짜를 구축 MKL의 설치에 포함 된 파일 인터페이스가 - 나는 다음과 같은 흐름이 될 것이라고 생각Fortran에서 파일 인터페이스/헤더 파일의 데이터에 의존하는 전 처리기 지시문을 사용하여 USE 문의 조건부 선택을 수행 할 수 있습니까?

/opt/intel/mkl/include/mkl.fi : MKL의

  1. 가져 오기 버전 번호를 파일 인터페이스
  2. 위에서 언급 한 것은 올바른 라이브러리와 컴파일 use 문을 실행
  3. 처리기 지시문을 통해 use에있는 라이브러리를 결정하는 버전 번호를 사용
내가 include 문 다음에 어떤 use 문을 배치하면

그러나, 컴파일 파일 인터페이스의 정보에 의존하거나 처리기 지시문을 사용하여 use 문장의 조건 선택을 달성하기 위해 어떤 방법이 있나요 error #6278: This USE statement is not positioned correctly within the scoping unit.

을 던지는 후 중단 헤더 파일?

가능 얼마나 어떤 use 문이 실행되는 use 문을 결정하는 데 필요한 데이터를 제공하는 include 문 앞에해야하기 때문에 내가 볼 수 없습니다. 내가 할 노력하고있어 보여주는 샘플 아래 포함,하지만 ·

module MKLVersion 

!Test for definition and value up here 
#ifdef INTEL_MKL_VERSION 

#if INTEL_MKL_VERSION >= 110200 
    use LAPACK95, only : ggevx, geevx, sygvd 

#elif INTEL_MKL_VERSION < 110200 
    use MKL95_LAPACK, only : ggevx, geevx, sygvd 

#endif 
#endif 

! but dont actually get the definition till we get here 

include '/opt/intel/mkl/include/mkl.fi' 

end module MKLVersion 
+1

어쨌든 include를 이전하면 아마도 도움이되지 않을 것입니다 (가능한 경우). 리터럴 포함은 컴파일 단계 _after_ preprocessing에서 발생합니다. 아마도 작동 할 전 처리기'#include '접근법이있을 것입니다. 또는 전 처리기에 값이있는 정의를 전달하십시오. – francescalus

+2

이 질문은 https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/676247에서도 논의됩니다. 위치 지정 문제는 다음과 같습니다. INCLUDE 자체는 아니지만 INCLUDE에서 가져온 INTERFACE와 같은 명령. –

+0

그건 나뿐 이었어, 스티브! 나는 당신이 미국 시간에 있고 아마 잠시 동안 대답하지 않을 것이라고 생각하기 때문에 나는 어제 떠났을 때 여기에 올렸습니다. –

답변

0

작동하지 않습니다, 궁극적으로, 아니되는이 질문에 짧은 대답 - 스티브 라이오넬가 지적했듯이, 포함 된 파일이 있었다 INTERFACE 문은 USE 문 앞에 올 수 없습니다.

그러나 이전 버전과 새로운 MKL 버전으로 코드를 컴파일 할 수있는 특정 사례에 대한 해결책을 찾았습니다.

참고 : * f95_precision.mod, mkl95_lapack.mod 및 mkl95_precision.mod 파일 중 하나에서 제거 될 예정이 intel article from 2009에 따르면, MKL의 이전 버전에서 작동하는 라이브러리를 호출하는 방법이 미래 릴리스. 현재 버전은 두 개의 USE 문을 지원합니다. 따라서 "USE MKL95_LAPACK"또는 "USE LAPACK95"를 선택할 수 있습니다. 향후 호환성을 위해 "USE LAPACK95"문을 사용하는 것이 좋습니다.

따라서 USE MKL95_LAPACK은 모든 것을 깨지 않고 USE LAPACK95으로 바꿀 수 있습니다.