Je cherchais des informations sur le codage de CUDA (le langage nvidia gpu) avec C #. J'ai vu quelques-unes des bibliothèques, mais il semble qu'elles ajouteraient un peu de surcharge (à cause des invocations p /, etc.).
Il existe un tel wrapper cuda 4.2 complet comme ManagedCuda . Vous ajoutez simplement le projet C++ cuda à votre solution, qui contient le vôtre projet c #, puis vous ajoutez simplement
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"
pour post-générer des événements dans les propriétés de votre projet c #, cela compile le fichier * .ptx et le copie dans le répertoire de sortie de votre projet c #.
Ensuite, vous devez simplement créer un nouveau contexte, charger le module à partir du fichier, charger la fonction et travailler avec l'appareil.
//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);
Cela a été commenté sur la liste nvidia dans le passé:
http://forums.nvidia.com/index.php?showtopic=97729
il serait facile d'utiliser P/Invoke pour l'utiliser dans des assemblys comme ceci:
[DllImport("nvcuda")]
public static extern CUResult cuMemAlloc(ref CUdeviceptr dptr, uint bytesize);
Il existe plusieurs alternatives que vous pouvez utiliser pour utiliser CUDA dans vos applications C #.
Vous pouvez en trouver plusieurs en ligne: jetez un œil à cette réponse par exemple.