3

Fortran で書かれたプロジェクトがあります。

これは PGI コンパイラを使用して実行できることはわかっていますが、ライセンスに行き詰まりたくありません。

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

https://github.com/olcf/OLCFHack15

今、私はここに述べられていることと同様のことをしたいと思っています。

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

より具体的には、セクション 8.3 に記載されています。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 でこのケースを再現するにはどうすればよいでしょうか。

4

1 に答える 1

1

cuBLAS とのインターフェースを探していますか、それともより一般的なものですか? cuBLAS は F77 スタイルのインターフェースを提供します ( http://docs.nvidia.com/cuda/cublas/#appendix-b-cublas-fortran-bindingsを参照) 。

OpenACC ソリューションは、「data」ディレクティブを使用して通常どおりにデータを管理しますが、「host_data」領域内から CUDA C ルーチンを呼び出します。「host_data」は、この領域でデバイス ポインタを使用する必要があることを指定します。したがって、「d_X」を cublasSaxpy に渡すと、デバイス ポインターが渡されます。

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

ただし、GNU 5.2 は「host_data」をサポートしておらず、ステータス ページ ( https://gcc.gnu.org/wiki/OpenACC ) を見たところ、6.0 の Fortran でもサポートされるようには見えません。 . 「host_data」が最適なソリューションであるため、これは残念です。

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

于 2016-04-13T17:10:15.177 に答える