我目前有一个主机函数,其中包括一个循环和各种 CUBLAS 调用。现在可以访问 CC 3.5 设备,我可以使用动态并行性编写一个更高效的内核。但是,我想继续支持 CC < 3.5 设备的旧功能。我现在用几个 gencodes 支持同一个二进制文件中的多个设备:
-gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35
我想继续生成支持这两种架构的单个二进制文件,但我想不出在主机代码中切换它的方法。NVCC 当然无法为主机 AFAIK 上的任何内容生成编译代码映像。
这不好(而且非常丑陋),因为为 CC < 3.5 构建的用户将无法使用 3.5 特性构建内核:
cudaGetDevice (¤t_device);
cudaGetDeviceProperties (¤t_device_properties, current_device);
if (current_device_properties.major < 3 && ... etc) {
...
}
else ...
__CUDACC__ 或 __CUDA_ARCH__ 在这里也没有用。
我的猜测是这是不可能的,我将不得不简单地开始编译单独的二进制文件并在预处理器中切换架构。但是,如果有人能想到任何事情,那就太好了。