Libtorch获取tensor数据指针抛出0xe06d7363异常问题求助
异常诱因
0xe06d7363是Windows平台下Visual Studio编译的C程序抛出未捕获C异常时对应的标准SEH异常码,本次异常由PyTorch内部的类型安全校验逻辑主动触发,核心原因是张量实际存储类型和data_ptr传入的模板类型不匹配:
- 创建张量时显式指定dtype为
torch::kInt64,对应C++类型为int64_t,Win64环境下该类型占8字节 - 调用
data_ptr<int>()取指针时,模板参数传入的是int类型,Win64环境下int为32位整型,占4字节,和张量实际存储类型完全不匹配 - PyTorch的
data_ptr<T>()方法内置类型校验逻辑,当模板参数T和张量实际dtype不一致时会直接抛出类型错误,和张量部署在CPU还是CUDA设备无关,因此两种场景下触发的异常完全一致。
错误代码定位
异常触发点为指针获取行:
// 类型不匹配:张量为kInt64类型,却用int类型取数据指针 int* x_ptr = x.data_ptr<int>();
修复方案
将data_ptr的模板参数替换为与torch::kInt64匹配的类型即可,两种写法等价:
- 使用标准整型类型:
// int64_t与torch::kInt64类型一一对应 int64_t* x_ptr = x.data_ptr<int64_t>();
- 使用PyTorch内置类型别名,避免跨平台类型宽度记忆错误:
// torch::LongType对应kInt64类型,别名等价于int64_t auto x_ptr = x.data_ptr<torch::LongType::type>();
补充注意:修正类型后,如果张量存储在CUDA设备上,拿到的是设备侧指针,不能直接在CPU端代码中解引用访问(比如示例中直接
std::cout << x_ptr[0]的写法会触发非法内存访问),这类指针只能传入CUDA核函数使用,若要在主机端读取数据,需要先将张量拷贝到CPU内存。
内容的提问来源于stack exchange,提问作者zihan
相关产品推荐
相关产品推荐

