2011-06-25 19 views
51

私はC#でCUDA(nvidia gpu言語)をコーディングする際の情報を探していました。私はライブラリのいくつかを見てきましたが、(p/invokesなどのために)少しオーバーヘッドを追加するようです。C#でC#をコーディングしていますか?

  • C#アプリケーションでCUDAを使用するにはどうすればよいですか? C++でコード化して、それをdllにコンパイルする方が良いでしょうか?
  • このようなラッパーを使用するオーバーヘッドは、CUDAを使用することで得られるメリットはありますか?
  • C#でC#を使用する良い例はありますか?

答えて

39

ManagedCudaのような素晴らしい完全なcuda 4.2ラッパーがあります。 あなたは、単に#プロジェクトcはあなたが含まれているソリューションにC++ CUDAプロジェクトを追加し、その後、あなたは自分のC#プロジェクトのプロパティで

call "%VS100COMNTOOLS%vsvars32.bat" 
for /f %%a IN ('dir /b "$(ProjectDir)Kernels\*.cu"') do nvcc -ptx -arch sm_21 -m 64 -o "$(ProjectDir)bin\Debug\%%~na_64.ptx" "$(ProjectDir)Kernels\%%~na.cu" 
for /f %%a IN ('dir /b "$(ProjectDir)Kernels\*.cu"') do nvcc -ptx -arch sm_21 -m 32 -o "$(ProjectDir)bin\Debug\%%~na.ptx" "$(ProjectDir)Kernels\%%~na.cu" 

するビルド後のイベントを追加し、これは* .ptxファイルとあなたの中にコピーし、それをコンパイルしますc#プロジェクト出力ディレクトリ。

次に、新しいコンテキストを作成し、ファイルからモジュールをロードし、関数をロードしてデバイスで作業するだけで済みます。

//NewContext creation 
CudaContext cntxt = new CudaContext(); 

//Module loading from precompiled .ptx in a project output folder 
CUmodule cumodule = cntxt.LoadModule("kernel.ptx"); 

//_Z9addKernelPf - function name, can be found in *.ptx file 
CudaKernel addWithCuda = new CudaKernel("_Z9addKernelPf", cumodule, cntxt); 

//Create device array for data 
CudaDeviceVariable<cData2> vec1_device = new CudaDeviceVariable<cData2>(num);    

//Create arrays with data 
cData2[] vec1 = new cData2[num]; 

//Copy data to device 
vec1_device.CopyToDevice(vec1); 

//Set grid and block dimensions      
addWithCuda.GridDimensions = new dim3(8, 1, 1); 
addWithCuda.BlockDimensions = new dim3(512, 1, 1); 

//Run the kernel 
addWithCuda.Run(
    vec1_device.DevicePointer, 
    vec2_device.DevicePointer, 
    vec3_device.DevicePointer); 

//Copy data from device 
vec1_device.CopyToHost(vec1); 
11

これは、過去にnvidiaのリストについてコメントされています:

http://forums.nvidia.com/index.php?showtopic=97729

そうのようなアセンブリでそれを使用するためにP /呼び出しを使用して簡単に次のようになります。

[DllImport("nvcuda")] 
    public static extern CUResult cuMemAlloc(ref CUdeviceptr dptr, uint bytesize); 
+1

リンクを削除しました。死者を表示する必要はありませんさらにリンクする。あなたのコメントを削除すると非常に親切です。人々はこれを否定することができます。 –

+0

私はあなたがCUDAコールをPInvokeできることを認識しませんでした。これがうまくいくためにNVidiaに買収する必要があるという恥ずべきこと。 –

2

C#アプリケーションでCUDAを使用するために使用できるいくつかの選択肢があります。

  • 別のプロジェクトにC++/CUDAライブラリを作成し、P/Invokeを使用します。ネイティブ呼び出しに対するP /呼び出しのオーバーヘッドは無視できる程度です。
  • ManagedCudaなどのCUDAラッパーを使用します(CUDA API全体が公開されます)。 CUDAランタイムAPI全体(便利)にDLLImportを手作業で書く必要はありません。残念ながら、別のプロジェクトに独自のCUDAコードを書く必要があります。
  • を推奨)あなたのC#コードからCUDA(ソースまたはバイナリのどちらか)が生成されますされ(フリー/オープンソース/独自のコンパイラを使用することができます

あなたがオンラインそれらのいくつかを見つけることができます。顔をしています例えばthis answer

2

で私は、NVIDIAのブログ記事でも言及する価値があるようhereを説明し、ハイブリを推測。Hereその関連GitHubには、それをレポであるようだ。

関連する問題