Cuda шаблоны

помогите пожалуйста создать шаблон в с использованием вычислением на куде!
итак в .cpp создаю шаблон:

  1. template <typename T> void GaussKernel(T* myPic, int width, int height, T* myFinalPic)
  2. {
  3. float* gaussMatrix = makeGaussMatrix();
  4. int nsize = width*height;
  5. float* dev_gaussMatrix;
  6. T* dev_myPic;
  7. T* dev_myNewPic;
  8. T* dev_myFinalPic;
  9. cudaMalloc((void**)&dev_gaussMatrix, CACHE_SIZE*sizeof(float));  
  10. cudaMemcpy(dev_gaussMatrix, gaussMatrix, CACHE_SIZE*sizeof(float), cudaMemcpyHostToDevice);
  11. cudaMalloc((void**)&dev_myPic, nSize*sizeof(T));
  12. cudaMemcpy(dev_myPic, myPic, nSize*sizeof(T), cudaMemcpyHostToDevice);
  13. cudaMalloc((void**)&dev_myNewPic, nSize*sizeof(T));  
  14. cudaMalloc((void**)&dev_myFinalPic, nSize*sizeof(T));
  15.       launch_horizontal<T>(dev_gaussMatrix, dev_myPic, dev_myNewPic, nSize, width, height);
  16.       launch_vertical<T>(dev_gaussMatrix, dev_myNewPic, dev_myFinalPic, nSize, width, height);
  17. myFinalPic = new T[nSize];
  18. cudaMemcpy(myFinalPic, dev_myFinalPic ,nSize*sizeof(T), cudaMemcpyDeviceToHost);
  19. };

на сколько я понимаю в .cu у меня пусто (только #include "gauss.cuh" #include "device_functions.h")
далее в .cuh у меня:

  1. template <typename T> __global__ void horizontalRun(float* dev_gaussMatrix, T* dev_myPic, T* dev_myNewPic, int nSize, int width, int height)
  2.     {
  3.                   int i = threadIdx.x + blockIdx.x * blockDim.x; ...и т.д.
  4.                  };
  5. template <typename T> __global__ void verticalRun(float* dev_gaussMatrix, T* dev_myNewPic, T* dev_myFinalPic, int nSize, int width, int height)
  6. {
  7.             int i = threadIdx.x + blockIdx.x * blockDim.x; ...и т.д.
  8.          };
  9. template <typename T> void launch_horizontal(float* dev_gaussMatrix, T* dev_myPic, T* dev_myNewPic, int nSize, int width, int height)
  10. {
  11. int numOfBlocks = (width * height + threadsPerBlock - 1)/threadsPerBlock;
  12. horizontalRun<T> <<<numOfBlocks, threadsPerBlock>>>(dev_gaussMatrix, dev_myPic, dev_myNewPic, nSize, width, height);
  13.    
  14. cudaThreadSynchronize();
  15. }
  16. template <typename T> void launch_vertical(float* dev_gaussMatrix, T* dev_myNewPic, T* dev_myFinalPic, int nSize, int width, int height)
  17. {
  18. int numOfBlocks = (width * height + threadsPerBlock - 1)/threadsPerBlock;
  19. verticalRun<T> <<<numOfBlocks, threadsPerBlock>>>(dev_gaussMatrix, dev_myNewPic, dev_myFinalPic, nSize, width, height);
  20. cudaThreadSynchronize();
  21. }
  22. #endif

ну и ничего не работает, судя по всему я вообще неправильно все это описываю.

Forums: 

Насколько я понимаю, nvcc

Насколько я понимаю, nvcc работает (т.е. выделяет kernel-части) до компилятора C++.

Т.е. все плохо
1) device- и host- части надо разделить в отдельные исходники
2) темплейты можно использовать только в host-части.

тоесть вообще нельзя на куде

тоесть вообще нельзя на куде сделать шаблонную функцию?

или я не совсем понял что нужно сделать?

находил эту ссылку, вроде ж

находил эту ссылку, вроде ж так и сделал как написано, но почему-то не компилится хоть убей

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

сорри что нагромоздил, сейчас упростил.
примеры с сдк компилятся, сам алгоритм тоже нармально работает без запихивания в шаблон. выдает ошибки, что что-то не нравится с ">". ошибка именно в синтаксисе описания шаблона. может не надо писать или еще что-то в этом роде..не пойму