помогите пожалуйста создать шаблон в с использованием вычислением на куде!
итак в .cpp создаю шаблон:
-
template <typename T> void GaussKernel(T* myPic, int width, int height, T* myFinalPic)
-
{
-
float* gaussMatrix = makeGaussMatrix();
-
int nsize = width*height;
-
float* dev_gaussMatrix;
-
T* dev_myPic;
-
T* dev_myNewPic;
-
T* dev_myFinalPic;
-
cudaMalloc((void**)&dev_gaussMatrix, CACHE_SIZE*sizeof(float));
-
cudaMemcpy(dev_gaussMatrix, gaussMatrix, CACHE_SIZE*sizeof(float), cudaMemcpyHostToDevice);
-
cudaMalloc((void**)&dev_myPic, nSize*sizeof(T));
-
cudaMemcpy(dev_myPic, myPic, nSize*sizeof(T), cudaMemcpyHostToDevice);
-
cudaMalloc((void**)&dev_myNewPic, nSize*sizeof(T));
-
cudaMalloc((void**)&dev_myFinalPic, nSize*sizeof(T));
-
launch_horizontal<T>(dev_gaussMatrix, dev_myPic, dev_myNewPic, nSize, width, height);
-
launch_vertical<T>(dev_gaussMatrix, dev_myNewPic, dev_myFinalPic, nSize, width, height);
-
myFinalPic = new T[nSize];
-
cudaMemcpy(myFinalPic, dev_myFinalPic ,nSize*sizeof(T), cudaMemcpyDeviceToHost);
-
};
на сколько я понимаю в .cu у меня пусто (только #include "gauss.cuh" #include "device_functions.h")
далее в .cuh у меня:
-
template <typename T> __global__ void horizontalRun(float* dev_gaussMatrix, T* dev_myPic, T* dev_myNewPic, int nSize, int width, int height)
-
{
-
int i = threadIdx.x + blockIdx.x * blockDim.x; ...и т.д.
-
};
-
template <typename T> __global__ void verticalRun(float* dev_gaussMatrix, T* dev_myNewPic, T* dev_myFinalPic, int nSize, int width, int height)
-
{
-
int i = threadIdx.x + blockIdx.x * blockDim.x; ...и т.д.
-
};
-
template <typename T> void launch_horizontal(float* dev_gaussMatrix, T* dev_myPic, T* dev_myNewPic, int nSize, int width, int height)
-
{
-
int numOfBlocks = (width * height + threadsPerBlock - 1)/threadsPerBlock;
-
horizontalRun<T> <<<numOfBlocks, threadsPerBlock>>>(dev_gaussMatrix, dev_myPic, dev_myNewPic, nSize, width, height);
-
-
cudaThreadSynchronize();
-
}
-
template <typename T> void launch_vertical(float* dev_gaussMatrix, T* dev_myNewPic, T* dev_myFinalPic, int nSize, int width, int height)
-
{
-
int numOfBlocks = (width * height + threadsPerBlock - 1)/threadsPerBlock;
-
verticalRun<T> <<<numOfBlocks, threadsPerBlock>>>(dev_gaussMatrix, dev_myNewPic, dev_myFinalPic, nSize, width, height);
-
cudaThreadSynchronize();
-
}
-
#endif
ну и ничего не работает, судя по всему я вообще неправильно все это описываю.
Насколько я понимаю, nvcc
Насколько я понимаю, nvcc работает (т.е. выделяет kernel-части) до компилятора C++.
Т.е. все плохо
1) device- и host- части надо разделить в отдельные исходники
2) темплейты можно использовать только в host-части.
тоесть вообще нельзя на куде
тоесть вообще нельзя на куде сделать шаблонную функцию?
или я не совсем понял что нужно сделать?
Я был уверен что нельзя. Но
Я был уверен что нельзя.
Но вот пишут: http://choorucode.wordpress.com/2011/03/14/cuda-template-kernels/
Значит можно. А я был неправ.
Ну и в примерах - есть (bicubicTexture)
находил эту ссылку, вроде ж
находил эту ссылку, вроде ж так и сделал как написано, но почему-то не компилится хоть убей
А примеры из Cuda Toolkit -
А примеры из Cuda Toolkit - компилируются?
template void GaussKernel(T*
template void GaussKernel(T* myPic, int width, int height, T* myFinalPic)
{
//...обьявляю указатели и выделяю память, копирую маллоками...
launch_function (dev_myPic, dev_myNewPic, width, height); };
на сколько я понимаю в .cu у меня пусто (только #include "gauss.cuh" #include "device_functions.h")
далее в .cuh у меня такое:
template __global__ void functionRun(T* dev_myPic, T* dev_myNewPic, int width, int height)
{ //вычисления в гпу };
template void launch_function(T* dev_myPic, T* dev_myNewPic, int width, int height)
{
int numOfBlocks = (width * height + threadsPerBlock - 1)/threadsPerBlock;
functionRun <<>>(dev_myPic, dev_myNewPic, width, height);
cudaThreadSynchronize();
}
#endif
сорри что нагромоздил, сейчас упростил.
примеры с сдк компилятся, сам алгоритм тоже нармально работает без запихивания в шаблон. выдает ошибки, что что-то не нравится с ">". ошибка именно в синтаксисе описания шаблона. может не надо писать или еще что-то в этом роде..не пойму