Pytorch LibTorch中的固定内存
我可能遗漏了一些真正基本的东西,但我在文档或网上找不到任何解释 我试图将GPUPytorch 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
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