问题汇总
在我的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上做了尝试而生气。所以我怀疑我在错误的范围内做了什么。
为什么会这样?
1条答案
按热度按时间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>();