2017-01-06 32 views
-1

CUDAカーネルを含むFortranサブルーチンをDLLとしてPGIコンパイラでコンパイルし、他のFortranコンパイラ(Fortran Powerstation)でコンパイルされたFortranプログラムで使用できますか?異なるfortranコンパイラ間のFortran dllライブラリ

Fortran Powerstationが提供するMSFLIBが必要なため、PGIで私の古いFortranプログラムをコンパイルできません。また、PGIが提供するDFLIBは必要な機能をいくつか実行しません。

私は試してみたように動作しません。 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ビット機能を持つIntelプロセッサの違いは何ですか?私は実際には32ビットを好む。 –

答えて

1

Fortranのクロスコンパイラ呼び出すことはできません。

は、PGI-CUDA-FortranコードをFortran 2003+ Cバインディング機能で公開することができます。しかし、Fortran固有の呼び出し規則をこのように使用することはできません(形状配列、派生データ型などと仮定)。

私はPGIコンパイラを使用していないので、それ以上コメントできません。

+1

古いPowerstationにはFortran 2003+のCバインディング機能はありません。それは長い間放棄されています。また、いくつかの基本的な実装がある場合は、それが現代の機能の残りの部分と同じようにバギーであることを確認してください。 –

1

mayと言えますが、それは容易ではありません。

他のコンパイラでビルドされたバイナリから呼び出し可能なDLLにPGIビルドされたOpenACCコード(Cコードではありますが)をDLLに追加しました。したがって、CUDA Fortranでも可能です。キーは、実行時の動的コンパイル(-Mcuda = nordc)なしでコンパイルすることです。バイナリをpgfortranにリンクする必要があります。ただし、RDCがなければ、外部モジュールで宣言されたモジュールデバイスデータを使用したり、外部モジュールの「デバイス」ルーチンを呼び出すことはできません。つまり、デバイスコードを1つのモジュールに含める必要があります。

Pierreは、通常、異なるFortranコンパイラでコンパイルされたオブジェクトを混在させることはできません。ただし、インターフェイスがF77またはCの呼び出し規約を使用していて、DLLでI/Oを実行していない場合は、可能性があります。