首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用GPU ( Caffe2 )时更改Caffe2中的blob值

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

Stack Overflow用户
提问于 2017-10-22 17:11:09
回答 1查看 332关注 0票数 0

我正在尝试手动访问blobs值并更改它。

我有一个名为"1conv1_w“的blob,我通过以下方式访问它:

代码语言:javascript
复制
auto 1conv1_w = caffe2::TensorCPU((*workspace.GetBlob("1conv1_w")).Get<caffe2::TensorCPU>()).data<float>();

这将返回指向float*的指针1conv1_w。

代码语言:javascript
复制
std::cout << *1conv1_w << std::endl

访问Blob "1conv1_w“中的第一个值,并修改该值。但是,当转换为GPU模式时,这将返回错误,因为指针中没有值。如果我用

代码语言:javascript
复制
auto 1conv1_w = caffe2::TensorCPU((*workspace.GetBlob("1conv1_w")).Get<caffe2::TensorCUDA>()).data<float>()[0];

然后我可以访问第一个值,但仍然不能访问blob中的其他值。

我想问题是因为在使用GPU时,内存实际上是一个临时内存。该值在CPU和GPU之间复制(可能是memcpy)。当我使用Get<caffe2::TensorCUDA>()时,它只是将我想要的地址或值复制给我。因此,即使我更改了这个地址中的值,它也不会影响保存在某个地方的实际值。

是否有人面临同样的问题,并且知道如何更改blob的实际值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-26 23:14:33

首先,您不能直接从CPU上下文中访问GPU内存。您可以考虑为您的目的编写CUDA内核。如果您确实需要在CPU上执行此操作,则可以通过以下方法从GPU获取数据到CPU:

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46876924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档