我想知道是否有一些简单的方法可以为不同的架构提供不同版本的内核。他们是一个简单的方法吗?或唯一的可能性是在独立文件中定义独立内核并要求nvcc编译为每个文件的不同架构?
答案 0 :(得分:8)
您可以通过编译器指令来实现。像
这样的东西__global__ void kernel(...) {
# if __CUDA_ARCH__ >= 350
do something
# else
do something else
# endif
}
答案 1 :(得分:0)
再多一点C ++ JackOLanterns回答略有修改:
template <unsigned int ARCH>
__global__ void kernel(...)
{
switch(ARCH)
{
case 35:
do something
break;
case 30:
do something else
break;
case 20:
so something else
break;
default:
do something for all other ARCH
break;
}
}
编辑:删除错误@ sgar91指出:
你可以通过
查询你的CUDA设备来调用内核cudaGetDeviceProperties(&props, devId);
unsigned int cc = props.major * 10 + props.minor;
switch(cc)
{
case 35:
kernel<35><<<1, 1>>>(/* args */);
break;
...
}