gpt4 book ai didi

c# - 用 C# 编写 CUDA?

转载 作者:IT王子 更新时间:2023-10-29 03:47:02 24 4
gpt4 key购买 nike

我一直在寻找有关使用 C# 编写 CUDA(nvidia gpu 语言)的信息。我看过一些库,但它们似乎会增加一些开销(因为 p/invokes 等)。

  • 我应该如何在我的 C# 应用程序中使用 CUDA?用 C++ 编写代码并将其编译成 dll 会更好吗?
  • 这种使用包装器的开销是否会扼杀我从使用 CUDA 中获得的任何优势?
  • 有没有在 C# 中使用 CUDA 的好例子?

最佳答案

ManagedCuda 是一个很好的完整 cuda 4.2 包装器.您只需将 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);

关于c# - 用 C# 编写 CUDA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6475490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com