Привет мир для CUDA.Net
Я пытаюсь написать детское приложение на CUDA.Net, но мне не повезло.
Я понял, чтобы:
using GASS.CUDA;
// ...
var c = new CUDA();
// c.Launch(myfunc); // ???? how ???
myfunc
по-видимому, должно быть типа GASS.CUDA.Types.CUfunction
но я не нашел, как определить один.
2 ответа
Сначала вам нужен файл.cu с вашим ядром (функция, которая будет выполняться на GPU). Давайте иметь файл mykernel.cu:
extern "C"
__global__ void fooFunction(float4* data) {
// there can be some CUDA code ...
}
Это должно быть скомпилировано в файл.cubin с помощью компилятора nvcc. Чтобы сообщить компилятору о компиляторе Visual C++, необходимо вызвать его из командной строки Visual Studio:
nvcc mykernel.cu --cubin
Это создает файл mykernel.cubin в том же каталоге.
Затем в коде C# вы можете загрузить этот двоичный модуль и запустить ядро. В объектном API более высокого уровня GASS.CUDA это может выглядеть так:
using GASS.CUDA;
// ...
CUDA cuda = new CUDA(true);
// select first available device (GPU)
cuda.CreateContext(0);
// load binary kernel module (eg. relative to from bin/Debug/)
CUmodule module = cuda.LoadModule("../../mykernel.cubin");
// select function from the module
CUfunction function = cuda.GetModuleFunction(module, "fooFunction");
// execute the function fooFunction() on a GPU
cuda.Launch(function);
Это оно!
Компилятор nvcc лучше вызывать как действие сборки, чем вызывать его вручную. Если кто-нибудь знает, как этого добиться, сообщите нам об этом.
К сожалению, CUDA.net очень плохо документирован, но http://www.hoopoe-cloud.com/files/cuda.net/2.0/CUDA.NET_2.0.pdf должен помочь вам начать работу. Кроме того, вам все еще нужно написать свое ядро на CUDA C, так что http://developer.download.nvidia.com/compute/cuda/3_2_prod/toolkit/docs/CUDA_C_Programming_Guide.pdf будет хорошей идеей, чтобы посмотреть также и, возможно, попробуйте запустить приложение CUDA C до его переноса на CUDA.net.