PyTorch高版本替换THC/THC.h为ATen API的代码适配咨询
适配方案说明
针对THC依赖的ATen替换方法
你遇到的'THC/THC.h': No such file or directory是PyTorch 1.11及以上版本的典型适配问题,这部分版本已经完全移除了旧的TH/THC系列接口,统一使用ATen作为底层张量运算API。你定位到的3行旧代码可以直接按如下规则替换:
- 删除第一行
#include <THC/THC.h>:旧的THC头文件已经不存在,PyTorch C++扩展统一通过引入#include <torch/extension.h>引入所有需要的ATen接口,Pointnet2项目的源码头部本来就包含该引入,不需要额外补充其他头文件。 - 删除第二行
extern THCState *state;:ATen架构下不存在全局的THCState上下文对象,所有设备、流的上下文都由PyTorch内部自动托管,不需要开发者手动声明维护。 - 替换第三行获取CUDA流的代码:把
cudaStream_t stream = THCState_getCurrentStream(state);替换为
cudaStream_t stream = at::cuda::getCurrentCUDAStream();
如果你的kernel需要绑定到特定张量所在设备的流,也可以传入设备索引参数:at::cuda::getCurrentCUDAStream(input_tensor.device().index()),对于Pointnet2项目的所有算子逻辑,直接使用无参版本即可和原有行为完全一致。
仅修改cpp文件能否解决编译报错
不能。
除了cpp文件外,你还需要检查两部分内容:
- 检查所有后缀为
.cu的CUDA源码文件,删除其中所有#include <THC/THC.h>的引入,同时把文件内所有通过THCState_getCurrentStream获取流的代码按上面的规则替换。如果遇到旧的THCudaCheck类宏报错,直接替换为ATen提供的AT_CUDA_CHECK宏即可。 - 检查
setup.py编译配置,如果其中有手动链接THC库的配置直接删除,新版本PyTorch编译扩展时会自动链接所有需要的依赖库,不需要手动指定THC相关链接项。
上述修改完成后,即可在高版本PyTorch下正常编译Pointnet2的算子扩展,不需要降级PyTorch版本。
内容的提问来源于stack exchange,提问作者won5830
相关产品推荐
相关产品推荐

