用C#编码CUDA?
我一直在寻找一些关于用C#编码CUDA(nvidia gpu语言)的信息。 我已经看到了一些库,但似乎会增加一些开销(因为p /调用等)。
- 我应该如何在C#应用程序中使用CUDA? 用C ++编写代码并编译成dll会更好吗?
- 使用包装的这种开销是否会丧失使用CUDA的优势?
- 有C#使用CUDA的好例子吗?
有一个不错的完整cuda 4.2包装与ManagedCuda 。 您只需将C ++ cuda项目添加到包含您的c#项目的解决scheme中,然后添加即可
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#项目属性中构build事件后,编译* .ptx文件并将其复制到c#项目输出目录中。
然后您只需创build新的上下文,从文件加载模块,加载function和设备工作。
//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);
在C#应用程序中可以使用几种替代方法来使用CUDA。
- 在一个单独的项目中编写一个C ++ / CUDA库,并使用P / Invoke。 P /调用本地调用的开销可能可以忽略不计。
- 使用诸如ManagedCuda之类的CUDA包装器(它将公开整个CUDA API)。 您不必为整个CUDA运行时API手动编写DLLImport(这很方便)。 不幸的是,你仍然必须在一个单独的项目中编写自己的CUDA代码。
- ( 推荐 )您可以使用免费/开源/专有编译器(这将生成CUDA代码(无论是来源或二进制)从您的C#代码。
你可以在网上find其中的几个:例如,看看这个答案 。