2017-02-01 6 views
0

私の質問はCUDAアプリケーションを作成していますが、メインのコンピュータがWindows PC(Visual Studio 2013)であるため、そこにアプリケーションを開発しました。しかし、最終的なアプリケーションは* nixサーバーにデプロイされます。Cudaレジスタコンパイラの最適化

私の質問は次のとおりです。

にVisual Studio 2013 optimziationフラグ/大井/オックスは(完全な最適化)(組み込み関数を使用可能)ちょうどので、フルを取得32regsに私のレジスタの使用を圧迫する管理占有率。

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\bin\nvcc.exe" -gencode=arch=compute_35,code=\"sm_35,compute_35\" --use-local-env --cl-version 2013 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\x86_amd64" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\include"  --keep-dir x64\Release -maxrregcount=0 --ptxas-options=-v --machine 64 --compile -cudart static  -DWIN32 -DWIN64 -DNDEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Ox /Zi /MD " -o Simulation.cu.obj "Simulation.cu" 

UbuntuのでGCC 4.9.4CUDA-8cmakeのO3最適化レベルでコンパイルを使用して、レジスタの数は、約49(> 32)です。

nvcc Simulation.cu -dc -o Simulation.cu.o -ccbin cc -m64 -DNDEBUG -Xcompiler ,\"-std=c++1y\",\"-w\",\"-O3\",\"-g\" -arch=sm_35 -std=c++11 -rdc=true -O3 --ptxas-options=-v -DNVCC 

フラグがありません。そして私はローカルメモリにレジスタを流したくない。

答えて

1

ツールキットの異なるバージョン(またはPTXにコンパイルした場合でもドライバ)は、同じコードに対して異なる数のレジスタを使用することがあります。

​​を使用して、特定のカーネルの意図した起動設定と占有目標をコンパイラに通知します。必要に応じて、レジスタの使用を停止させようとします。
レジスタをローカルメモリに流出させる必要があるかどうかは、コントロールの範囲外ですが、コンパイラは通常、非常に妥当な動作をします。

+0

私は100%の占有を望んでいるので、私は-maxrregcountを使用せず、打ち上げ範囲に頼っていないのですが、リンクのおかげで彼らの存在は分かりませんでした。 コンパイル単位(.cuファイル)ごとに1つのカーネルがある場合、ptxコンパイルではプラットフォーム固有ではないので、両方のプラットフォームで同じ結果が期待されます。 – stevengatsios

+1

-maxrregcountも同様に機能します。カーネルごとの起動バウンドアノテーションが後で追加され、各カーネルが最適な設定を使用できるようになりました。 – tera

+0

PTXコンパイルは必ずしもプラットフォーム固有ではありませんが、異なるバージョンのツールキットを使用しています。新しいコンパイラのバージョンには、追加の最適化と調整されたヒューリスティックが含まれており、異なるレジスタの使用につながる可能性があります。 – tera