如何在使用GPU(C ++)时更改Caffe2中的blob值

时间:2017-10-22 17:11:09

标签: c++ caffe2

我正在尝试手动访问blob值并更改它 我有一个名为" 1conv1_w"我通过以下方式访问它:

auto 1conv1_w = caffe2::TensorCPU((*workspace.GetBlob("1conv1_w")).Get<caffe2::TensorCPU>()).data<float>();

这会将指针float*返回到1conv1_w。在CPU模式下,我可以使用

std::cout << *1conv1_w << std::endl

访问Blob&#34; 1conv1_w&#34;中的第一个值以及修改价值。但是,当转为GPU模式时,这将返回错误,因为指针内没有值。如果我使用

auto 1conv1_w = caffe2::TensorCPU((*workspace.GetBlob("1conv1_w")).Get<caffe2::TensorCUDA>()).data<float>()[0];

然后我可以访问第一个值,但仍然无法访问blob中的其他值 我想这个问题是因为在使用GPU时,内存实际上是一个临时内存。该值在CPU和GPU之间复制(可能是memcpy)。当我使用Get<caffe2::TensorCUDA>()时,它只是复制我想要的地址或值。因此,即使我更改此地址中的值,也不会影响某处保存的实际值。

有没有人遇到同样的问题,知道如何更改blob的实际值?

1 个答案:

答案 0 :(得分:0)

首先,您无法直接从CPU上下文访问GPU内存。您可以考虑为您的目的编写CUDA内核。如果你真的需要在CPU上进行,那么你可以通过以下方式从GPU获取数据:

CPUContext context;
TensorCPU output;
auto& input = (*workspace.GetBlob("1conv1_w")).Get<TensorCUDA>();
output.ResizeLike(input);
context.CopyItems<CUDAContext, CPUContext>(
    input.meta(),
    input.size(),
    input.raw_data(),
    output.raw_mutable_data(input.meta()));

然后您可以修改CPU版本并以相同的类比方式将其放回GPU。