【发布时间】:2013-11-09 06:22:15
【问题描述】:
我正在尝试基于布尔变量模板化 CUDA 内核(如下所示:Should I unify two similar kernels with an 'if' statement, risking performance loss?),但我不断收到编译器错误,提示我的函数不是模板。我认为我只是遗漏了一些明显的东西,所以这很令人沮丧。
以下方法不起作用:
util.cuh
#include "kernels.cuh"
//Utility functions
kernels.cuh
#ifndef KERNELS
#define KERNELS
template<bool approx>
__global__ void kernel(...params...);
#endif
kernels.cu
template<bool approx>
__global__ void kernel(...params...)
{
if(approx)
{
//Approximate calculation
}
else
{
//Exact calculation
}
}
template __global__ void kernel<false>(...params...); //Error occurs here
main.cu
#include "kernels.cuh"
kernel<false><<<dimGrid,dimBlock>>>(...params...);
以下确实有效:
util.cuh
#include "kernels.cuh"
//Utility functions
kernels.cuh
#ifndef KERNELS
#define KERNELS
template<bool approx>
__global__ void kernel(...params...);
template<bool approx>
__global__ void kernel(...params...)
{
if(approx)
{
//Approximate calculation
}
else
{
//Exact calculation
}
}
#endif
main.cu
#include "kernels.cuh"
kernel<false><<<dimGrid,dimBlock>>>(...params...);
如果我扔了
template __global__ void kernel<false>(...params...);
kernels.cuh 末尾的一行也可以。
我收到以下错误(均指上面的标记行):
kernel is not a template
invalid explicit instantiation declaration
如果有什么不同,我会在一行中编译所有 .cu 文件,例如:
nvcc -O3 -arch=sm_21 -I. main.cu kernels.cu -o program
【问题讨论】: