pytorch 调用tensor.packed_accessor32()抛出内存错误

4zcjmb1e  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(196)

问题汇总

在我的main方法中,我创建了一些Tensor并将它们传递给函数measure_distance_cuda。从那里,我尝试创建访问器以传递给我编写的内核(为了最小化工作示例而删除)。然而,当使用tensor.packed_accessor<>()创建访问器时,我从TensorBase.h得到以下运行时错误:

Exception has occurred: CPP/c10::Error
Unhandled exception at 0x00007FF8071ECF19 in cuda_test.exe: Microsoft C++ exception: c10::Error at memory location 0x0000004A42CFE4F0.

我尝试过:

我的第一个想法是内存错误很奇怪,可能指向错误的行,所以我删除了对实际使用访问器的Cuda内核的调用。所以没有索引发生。但是,错误仍然存在。

最小可复制代码

我的主要功能:

#include <iostream>

#include <ATen/ATen.h>
#include <torch/types.h>

#include "raycast_cuda.cuh"

int main() {

    auto vert_options = at::TensorOptions().dtype(torch::kFloat64).device(torch::kCUDA);

    torch::Tensor vertices = torch::tensor(
        {{-1, 1, 0},
         {1, 1, 0},
         {-1, -1, 0}}, vert_options
    );

    at::Tensor distances = measure_distance_cuda(vertices);
    std::cout << distances << std::endl;
}

raycast_cuda.cu

#include <cuda.h>
#include <cuda_runtime.h>

#include <ATen/ATen.h>
#include <torch/types.h>

__host__
at::Tensor measure_distance_cuda(at::Tensor vertices) {

    // get return tensor and accessor ****NO ERROR HERE****
    at::TensorOptions return_tensor_options = at::TensorOptions().device(torch::kCUDA);
    at::Tensor distances = at::zeros({n_rays, n_faces}, return_tensor_options);
    at::PackedTensorAccessor32<float_t, 2> d_acc = distances.packed_accessor32<float_t, 2>();

    // get accessors for inputs ****ERROR HAPPENS HERE****
    at::PackedTensorAccessor32<float_t, 2> vert_acc = vertices.packed_accessor32<float_t, 2>()

    return distances;
}

一些想法:

  • 我注意到为返回值(distances)创建一个访问器没有任何问题。它只是因为我在传递给函数的Tensor上做了尝试而生气。所以我怀疑我在错误的范围内做了什么。

为什么会这样?

s1ag04yj

s1ag04yj1#

我在PyTorch论坛上得到了一个快速的答案...答案很简单。我将输入声明为kFloat64,它对应于double_t,而不是float_t
auto vert_options = at::TensorOptions().dtype(torch::kFloat64).device(torch::kCUDA);
应该是
auto vert_options = at::TensorOptions().dtype(torch::kFloat32).device(torch::kCUDA);
这样我就可以打电话给你
at::PackedTensorAccessor32<float_t, 2> vert_acc = vertices.packed_accessor32<float_t, 2>();

相关问题