また、CUDA8で新設されたヒントAPIを使うことでも性能を改善できる。cudaMemPrefetchAsyncは非同期でプリフェッチを行う機能で、事前にプリフェッチでコピーを行っておけば、ページフォールトは発生しないし、メモリコピーの待ち時間も必要なくなるという点で効果が大きい。

cudaMemAdviseは、ptrで指されるメモリ領域が、READ_ONLYなどの使い方を指定することができる。この指定は、実行中に設定したり、変更したりすることができる。

CUDA8では、非同期プリフェッチとページの使い方のアドバイスを行う関数が追加された

次の図では、mykernelの起動の直前に必要なデータをプリフェッチするcudaMemPrefetchAsyncを呼び出している。これは、ページフォールトの発生を減らし、コピー開始のタイミングも早くなる効果がある。

cudaMemPrefetchAsyncを事前に呼び出すと、ページフォールトの回数が減り、コピーの開始が早くなる

cudaMemAdviseで、cudaMemAdviseReadMostlyというヒントを与えると、大部分はReadとして扱われ、GPUのページフォールトでGPUメモリにはRead-Onlyのページが作られる。

cudaMemAdviseでRead Mostlyと指定するとRead-Onlyのページが作られる

次の例では、cudaMemAdviseでRead Mostlyと指定し、cudaMemPrefetchAsyncでプリフェッチしたデータはRead-Onlyのページが生成される。そうすると、KernelのアクセスがReadだけなら、GPUアクセスでも、CPUアクセスでもページフォールトは発生しない。

なお、Read Mostlyでも書き込みアクセスは可能で、その場合はページフォールトが発生して書き込みが行われることになる。

GPUにRead-Onlyのページを作り、GPUのアクセスがReadだけなら、GPUのアクセス、CPUのアクセスともにページフォールトは発生しない

Pascal GPUでは、GPUがページフォールトを扱えるようになり、オンデマンドでページの移動が可能になった。これにより、グラフ処理のようなケースでは、GPUメモリより大きなメモリを必要とするOut-of-Coreの問題の実行が簡単になり、動的キューなどのケースではメモリのムダが省ける。

また、CUDA8で追加されたヒントを使うとさらに最適化ができると述べて、成瀬氏は発表を締め括った。