You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:15:30