簡體   English   中英

用C#編寫CUDA?

[英]Coding CUDA with C#?

我一直在尋找有關使用C#編寫CUDA(nvidia gpu語言)的一些信息。 我已經看到了一些庫,但似乎它們會增加一些開銷(因為p / invokes等)。

  • 我應該如何在C#應用程序中使用CUDA? 用C ++編寫代碼並將其編譯成dll會更好嗎?
  • 使用包裝器的這種開銷是否會破壞使用CUDA所帶來的任何好處?
  • 有沒有使用C#使用CUDA的好例子?

有一個很好的完整的cuda 4.2包裝作為ManagedCuda 您只需將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"

要在c#項目屬性中構建事件,這將編譯* .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);

這已在過去的nvidia列表中評論過:

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

使用P / Invoke很容易在程序集中使用它,如下所示:

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

我想在這里作為Nvidia的博客文章解釋的Hybridizer也值得一提。 是它的相關GitHub回購似乎。

您可以使用幾種方法在C#應用程序中使用CUDA。

  • 在單獨的項目中編寫C ++ / CUDA庫,並使用P / Invoke。 P /調用本機調用的開銷可能可以忽略不計。
  • 使用CUDA包裝器,例如ManagedCuda (它將公開整個CUDA API)。 您不必手動為整個CUDA運行時API編寫DLLImports(這很方便)。 不幸的是,您仍然需要在單獨的項目中編寫自己的CUDA代碼。
  • 推薦 )您可以使用free / opensource /專有編譯器(它將從您的c#代碼生成cuda(源代碼或二進制代碼)。

您可以在線找到其中幾個:例如,看一下這個答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM