pytorch - LibTorch 中的固定内存

标签 pytorch tensor libtorch

我可能错过了一些非常基本的东西,但我在文档或在线中找不到任何解释

我正在尝试将 GPU at::Tensor 复制到 CPU 上的固定张量,但是一旦复制它,CPU 张量就不再固定。我假设它只是创建 GPU 张量的新副本并对其进行分配,但如果是这种情况,如何复制到预先分配的固定内存?

我的测试代码:

    at::Tensor gpu = at::randn({1025,1025}, device(at::kCUDA));
    at::Tensor pinned = at::empty(gpu.sizes(), device(at::kCPU).pinned_memory(true));
    std::cout << "Is Pinned: " << std::boolalpha << pinned.is_pinned() << std::endl;
    pinned = gpu.to(at::kCPU);
    std::cout << "Is Pinned: " << std::boolalpha << pinned.is_pinned() << std::endl;

输出为

Is Pinned: true
Is Pinned: false

使用 torch:: 而不是 at:: 也会发生这种情况

使用从源代码编译的 LibTorch 1.5.0 在 Ubuntu 16.04 上进行测试

最佳答案

我找到了一种方法,那就是使用 copy_ 函数

...
//pinned = gpu.to(torch::kCPU, true);
gpu.copy_(pinned);
std::cout << "Is Pinned: " << std::boolalpha << pinned.is_pinned() << std::endl;

此输出

Is Pinned: true
Is Pinned: true

我认为这是有道理的,因为 to 函数返回一个张量而不是进行操作。尽管我希望 to 的某些变体能够允许它。

哦,好吧,它是这样工作的。

关于pytorch - LibTorch 中的固定内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63324584/

相关文章:

python - PyTorch找不到名字?? (名称错误: name 'device' is not defined)

python - 如何为 tensorflow 建模数据?

c++ - libtorch中的np.delete等效于什么?

python - Pytorch C++ (Libtroch),使用操作间并行性

python - 将不均匀大小的列表转换为 LSTM 输入张量

python - PyTorch 和 TensorFlow 对象检测 - 评估 - <class 'numpy.float64' > 类型的对象不能安全地解释为整数

python-3.x - 更改 Pytorch 3D 张量内的值

multidimensional-array - 如何在 Julia 的特定轴上对高阶多维数组(或张量)进行切片?

c++ - pytorch/libtorch C++ 中的自定义子模块

python - 具有自定义层的 PyTorch 网络在 CPU 上运行良好,但在移动到 GPU 时会出现 cudaErrorIllegalAddress