调用tensor.packed_accessor32()触发内存错误的原因排查
问题分析与解决方案
核心错误原因
- 数据类型不匹配:主函数中创建的
vertices张量是torch::kFloat64(双精度浮点)类型,但在measure_distance_cuda函数中,你尝试用PackedTensorAccessor32<float_t, 2>(单精度浮点访问器)去访问它。PackedTensorAccessor对张量类型有严格要求,类型不匹配会直接触发TensorBase中的断言错误,这就是你看到的运行时异常的根源。 - 未定义变量:代码中
n_rays和n_faces没有定义,虽然这会导致编译错误,但你的运行时错误主要由类型不匹配引发。
修复步骤
1. 统一张量与访问器的类型
选择以下两种方案之一:
- 方案一:修改输入张量类型为单精度
在主函数中调整张量的dtype为torch::kFloat32:auto vert_options = at::TensorOptions().dtype(torch::kFloat32).device(torch::kCUDA); - 方案二:使用匹配的双精度访问器
在CUDA函数中,将访问器的模板参数改为double,匹配输入张量的Float64类型:at::PackedTensorAccessor32<double, 2> vert_acc = vertices.packed_accessor32<double, 2>();
2. 定义缺失的变量
给n_rays和n_faces添加具体的数值定义,同时确保返回张量的dtype与访问器一致:
const int n_rays = 10; // 根据实际需求修改数值 const int n_faces = 3; at::TensorOptions return_tensor_options = at::TensorOptions().device(torch::kCUDA).dtype(torch::kFloat64); at::Tensor distances = at::zeros({n_rays, n_faces}, return_tensor_options);
修复后的完整CUDA函数示例
#include <cuda.h> #include <cuda_runtime.h> #include <ATen/ATen.h> #include <torch/types.h> __host__ at::Tensor measure_distance_cuda(at::Tensor vertices) { // 定义缺失的维度变量 const int n_rays = 10; const int n_faces = 3; // 配置返回张量的参数,保持类型与输入一致 at::TensorOptions return_tensor_options = at::TensorOptions().device(torch::kCUDA).dtype(vertices.dtype()); at::Tensor distances = at::zeros({n_rays, n_faces}, return_tensor_options); // 使用匹配类型的访问器 at::PackedTensorAccessor32<double, 2> d_acc = distances.packed_accessor32<double, 2>(); at::PackedTensorAccessor32<double, 2> vert_acc = vertices.packed_accessor32<double, 2>(); return distances; }
额外说明
PackedTensorAccessor仅能访问连续存储的张量,不过你创建的输入张量默认是连续的,所以无需额外处理。核心问题始终是类型匹配——访问器的模板参数必须和张量的dtype完全对应,否则会触发c10的错误断言。
内容的提问来源于stack exchange,提问作者rocksNwaves
相关产品推荐
相关产品推荐

