Pytorch LibTorch中的固定内存

Pytorch LibTorch中的固定内存,pytorch,tensor,libtorch,Pytorch,Tensor,Libtorch,我可能遗漏了一些真正基本的东西,但我在文档或网上找不到任何解释 我试图将GPUat::Tensor复制到CPU上的固定张量,但一旦复制它,CPU张量就不再固定。我假设它只是创建一个GPU张量的新副本并分配它,但如果是这样,如何复制到预先分配的固定内存 我的测试代码: at::Tensor gpu = at::randn({1025,1025}, device(at::kCUDA)); at::Tensor pinned = at::empty(gpu.sizes(), devic

我可能遗漏了一些真正基本的东西,但我在文档或网上找不到任何解释

我试图将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;
这同样发生在
torch::
而不是
at::


使用LibTorch 1.5.0在ubuntu16.04上进行测试,该软件是从源代码编译而来的,我找到了一种方法,那就是使用
copy\uu
函数

...
//pinned = gpu.to(torch::kCPU, true);
gpu.copy_(pinned);
std::cout << "Is Pinned: " << std::boolalpha << pinned.is_pinned() << std::endl;
我想这是有意义的,因为
to
函数返回张量而不是操作。虽然我希望
的一些变体允许它


哦,是这样的。

出于好奇,为什么要将GPU张量复制到带有固定内存的CPU上?通常是另一种方式(通过CPU将数据加载到页面锁定的内存中,以加快向GPU设备的传输)。顺便说一句,您可以始终使用
torch
名称空间,而不是ATen的
at
作为
torch:
转发
at
中的所有内容(这使得代码不那么混乱)。我们有一个在gpu上运行推断的应用程序,将其切片并拆分为不同的张量,然后我们需要将其下载到cpu,以便在应用程序的其他部分继续使用它。由于这是一个实时应用程序,每个毫秒都很重要,我们会尽可能地进行优化,这为我们节省了大约3毫秒的时间,所以我们很高兴:)感谢您对名称空间的评论。很高兴知道
...
//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