2016-04-12 9 views
3

私たちはFortranで書かれたプロジェクトを持っています。OpenACC Library相互運用性:デバイスポインタを取得する方法は?

今私は、これはPGIコンパイラを使用して行うことができますが、私はライセンスが立ち往生する必要はありません知っています。

私たちは私たちのプロジェクトでOpenACCを使用できるかどうかを確認しようとしています。ここではgcc5.2のインストール手順を説明します。

https://github.com/olcf/OLCFHack15

今私はここに記載されているものと同様の何かをしたいです。具体的にはセクション8.3に記載されているものを

https://gcc.gnu.org/onlinedocs/libgomp/OpenACC-Library-Interoperability.html

。私はgfortranを使って正確に再現しようとしています。残念ながら、私はfortranでそれをどうやってやれるのか分かりません。例では、

d_X = acc_copyin(&h_X[0], N * sizeof (float)); 

これはD_Xが直接

s = cublasSaxpy(h, N, &alpha, d_X, 1, d_Y, 1); 

で使用することができます。しかし、FORTRANで、acc_copyinは何も返しません。

したがって、私はFortranでこのケースをどのように複製しますか?

+0

仕様を見ると、OpenACCのFortranインターフェイスはかなり制限されているようです。これは 'type(c_ptr)'を使って可能だったとしても、ポインタのものを避けています。 'bind(C)'を使ってC関数を呼び出すことが可能かどうか分かりません。 –

答えて

1

あなたはcuBLASとのインターフェースを探していますか、これはもっと一般的ですか? OpenACCソリューションは、通常は "data"ディレクティブを使用してデータを管理しますが、 "host_data"領域内からCUDA Cルーチンを呼び出します。 "host_data"は、デバイスポインタがこの領域で使用されるべきであることを指定します。そのため、cublasSaxpyに「d_X」を渡すと、デバイスポインタが渡されます。

cuBLASの注意事項では、上記のF77インターフェイスがホスト配列を予期しており、データの動きを管理します。したがって、正しいデバイスルーチンを呼び出すCUDA Cラッパー関数を記述する必要があります。 (CUDA Fortranはこのためのcublasモジュールを提供していますが、PGIのみです)

GNU 5.2は "host_data"をサポートしていませんが、ステータスページ(https://gcc.gnu.org/wiki/OpenACC)を見ていますFortran 6.0でもサポートされています。これは "host_data"が最適なソリューションであることから不幸です。

NVIDIAは、OpenACCツールキット(参照:https://developer.nvidia.com/openacc)の一部として、教育目的で学生や学者に無料のPGIライセンスを提供しています。

+0

私は間違った質問を解釈するかもしれませんが、私はそれを次のように見ています:Fortran OpenACCルーチン 'acc_copyin'によって私が割り当てた(そしてデータをコピーした)メモリのデバイスポインタを取得できますか?私がOpenACCの仕様書を読んだとき、彼らは基本的にはFortranインタフェースのポインタとメモリの割り当てと関係があるものを無視してしまい、それをかなり損なうものでした。私はより強力なC 'acc_'ルーチンにカスタムFortranインタフェースを書き込もうとしますが、呼び出すことができるのか、背後にあるいくつかの魔法があるのか​​どうかはわかりません。 –

+0

私はそれが見通しではないと思います。なぜなら、生のCポインタを扱うことはFortranで簡単にはできないからです。CUDA Fortranでは言語がデバイスデータの概念を含むように拡張されていたので簡単ですが、通常のFortranでは少し難しいです。ユースケースはありますか?そうであれば、私はOpenACC委員会([email protected])に直接メモを送ってこれを追加することを提案します。彼らは常に良い提案とアイデアを探しています。 –

+0

ポインタ算術演算をしないで '(void *) 'を格納して渡すだけであれば、FortranではCポインタを' type(c_ptr) 'として直接使うことができます。もう一つのオプションは 'integer(c_intptr_t)'ですが、悪化します。どちらも10年間以上の言語で利用可能です。デバイスポインタが 'void * 'と互換性がない場合、これは別の話です。 CUDA FortranはOpenACCのポイントではなく、CUDAで直接プログラミングすることを避けていますか?私が書いたように、関数であればFortranからC 'acc_malloc'を呼び出すことができますが、背後で何かが起こっていないかどうかはわかりません。 –