2017-01-06 4 views
-1

PGI 컴파일러를 통해 CUDA 커널을 포함하는 Fortran 서브 루틴을 DLL로 컴파일 한 다음 다른 Fortran 컴파일러 (Fortran Powerstation)에서 컴파일 한 Fortran 프로그램에서 사용할 수 있습니까?다른 Fortran 컴파일러에 걸친 Fortran dll 라이브러리

Fortran Powerstation에서 제공하는 MSFLIB가 필요하고 PGI에서 사용할 수있는 DFLIB가 필자가 필요로하는 일부 기능을 수행하지 않기 때문에 이전의 Fortran 프로그램을 PGI에서 컴파일 할 수 없습니다.

나는 그것을 시도하고 볼 수있는 것처럼 작동하지 않습니다. obj1.lib는 PGI Fortran 컴파일러를 사용하여 컴파일되며 prog.f는 Fortran Powerstation에서 컴파일됩니다 (실패 시도). https://i.stack.imgur.com/YLIjx.png

+0

Powerstation은 낡은 버그 조각입니다 ... MSFLIB에서 루틴을 대체하기 만하면 합병증의 가치가 없습니다. 아아, 32 비트이고 2017입니다! –

+0

그 정보를 가져 주셔서 감사합니다. 아무도 여기 주위에 물어 보지 않을 것입니다! –

+0

PGI에서 32 비트 및 64 비트 pgfortran으로 컴파일 된 실제 * 8 변수가있는 경우, 64 비트 기능이있는 인텔 프로세서의 차이점은 무엇입니까? 실제로 32 비트를 선호합니다. –

답변

1

포트란 크로스 컴파일러 호출 아니다.

무엇이 일까요? 가능한 것은 Fortran 2003+ C 바인딩 기능을 통해 PGI-CUDA-Fortran 코드를 노출하는 것입니다. 그러나 이런 식으로 Fortran 전용 호출 규칙을 사용할 수는 없습니다 (모양 배열, 파생 된 데이터 유형 등).

PGI 컴파일러를 사용하지 않으므로 더 이상 언급 할 수 없습니다.

+1

이전 Powerstation에는 Fortran 2003+ C 바인딩 기능이 없습니다. 그것은 오랫동안 버려졌습니다.그리고 기본적인 구현이 있다면 그것은 나머지 현대 기능과 마찬가지로 버그입니다. –

1

나는 일 수있다.이 가능하지만 쉽지는 않을 것이다.

다른 컴파일러가 만든 바이너리에서 호출 할 수있는 DLL에 PGI 빌드 OpenACC 코드 (C 코드 임에도 불구하고)를 DLL에 추가했습니다. 따라서 CUDA Fortran에서도 가능할 수 있습니다. 핵심은 런타임 동적 컴파일 (-Mcuda = nordc)없이 컴파일하여 바이너리를 pgfortran과 연결해야합니다. 그러나 RDC가 없으면 외부 모듈에서 선언 된 모듈 장치 데이터를 사용하거나 외부 모듈에서 "장치"루틴을 호출 할 수 없습니다. 즉, 장치 코드를 단일 모듈에 포함시켜야합니다.

Pierre는 일반적으로 다른 Fortran 컴파일러로 컴파일 된 객체를 혼합 할 수 없다는 점에 틀림 없습니다. 그러나 인터페이스가 F77 또는 C 호출 규칙뿐만 아니라 DLL에서 I/O를 사용하지 않는다면 가능할 수도 있습니다.