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

итак в .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

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