2017-09-06 9 views
1

OpenACCを使用してTesla GPUで使用するためにPGIコンパイラでコンパイルしたC++コードをいくつか作成しました。"無効なアドレス空間"エラーのデバッグ

警告なしでコンパイルは成功します。

私はプログラムを実行して、2つのエラーを取得:インターネットは問題が自動的に敷物の下に掃引されるようにenabling unified memoryを示唆する以外に、このことについて多くを知っているようには見えない

call to cuStreamSynchronize returned error 717: Invalid address space 
call to cuMemFreeHost returned error 717: Invalid address space 

を。私はそのような解決策ではない。

これをデバッグするにはどうすればよいですか?

CPU上でのみ実行されるC++コードでは、gdbを起動し、バックトレースを行い、「ああ!

しかし、今私は、CPUにの2つの間を流れるGPUとその上に住んでいるコードを持っています。私はどのツールを使うべきかも知らない。

問題が解消されるまでコメントアウトを開始するのは間違いですが、それはあまりにも最適ではないようです。

答えて

1

"cuda-gdb"を使用してデバイスコードをデバッグするか、 "cuda-memcheck"を使用してメモリエラーをチェックできます。

私もここで助けになるとは思っていませんが。このエラーは、デバイスコードが誤ったメモリ空間からのアドレスを使用して命令を発行していることを示しています。たとえば、グローバルメモリポインタを必要とする命令を持つ共有メモリポインタを使用します。

私はこのエラーを以前に見たことがありませんでした。以前のバグレポートも表示されていませんでした。原因についてしか理論化できません。 1つの可能性は、外部のギャング・ループからベクトル・ルーチンに渡される共有メモリー変数(スカラーまたは配列を「private」句、または「cache」ディレクティブに持つ場合)です。この場合、ベクトルルーチンはグローバルメモリ内にあるかのように変数にアクセスしている可能性があります。

原因は何でも、コンパイラエラーです。可能であれば、PGIカスタマーサービス([email protected])に投稿例を投稿してください。その例を私たちのコンパイラエンジニアに調査のためにお渡しします。

原因をよく理解すると、回避策を試すこともできます。その間は、 "-ta = tesla:nollvm、keepgpu"でコンパイルを試すことができます。 "nollvm"を指定すると、コンパイラは、デフォルトのLLVMデバイスコードジェネレータとは対照的に、OpenACCカーネルの中間CUDA Cバージョンを生成します。 "keepgpu"はあなたが調べることができる中間 ".gpu"ファイルを保持します。

+0

ありがとう、マット!これをテストするまでにはおそらく2、3日かかりますが、あなたが提案したアドレスに問題のコード(再現可能な例になるほど短い)を電子メールで送信しました。 – Richard

+0

問題は、ローカル変数がアトミックで使用されていることです。 Atomicsは、共有メモリまたはグローバルメモリでのみ使用できます。この問題を解決し、コードのパフォーマンスを向上させるための推奨される変更を含む最新のソースファイルをお送りしました。 –

0

デバッグに役立つ環境変数がいくつかあります。任意の組み合わせを有効にすることができます:

export PGI_ACC_TIME=1 #Profile time usage 
export PGI_ACC_NOTIFY=1 #Set to values 0-3 where 3 is the most detailed 
export PGI_ACC_DEBUG=1 #Extra debugging info 
関連する問題