如何在使用 GPU 时更改 Caffe2 中的 blob 值 (C++)
How to change blob value in Caffe2 while using GPU (C++)
我正在尝试手动访问 blob 值并更改它。
我有一个名为"1conv1_w"的 blob,我通过以下方式访问它:
auto 1conv1_w = caffe2::TensorCPU((*workspace.GetBlob("1conv1_w")).Get<caffe2::TensorCPU>()).data<float>();
这将返回指向1conv1_w float*
指针。在CPU模式下,我可以使用
std::cout << *1conv1_w << std::endl
以访问 Blob"1conv1_w"中的第一个值以及修改该值。但是,当切换到 GPU 模式时,这将返回错误,因为指针中没有值。如果我使用
auto 1conv1_w = caffe2::TensorCPU((*workspace.GetBlob("1conv1_w")).Get<caffe2::TensorCUDA>()).data<float>()[0];
然后,我可以访问第一个值,但仍然无法访问 blob 中的其他值。
我想问题是因为在使用 GPU 时,内存实际上是一个临时内存。该值在 CPU 和 GPU 之间复制(可能是内存)。当我使用Get<caffe2::TensorCUDA>()
它只是复制我想要的地址或值。因此,即使我更改此地址中的值,也不会影响保存在某处的实际值。
有没有人面临同样的问题并知道如何更改 blob 的实际值?
首先,您无法直接从 CPU 上下文访问 GPU 内存。您可以考虑为您的目的编写 CUDA 内核。如果您确实需要在CPU上执行此操作,则可以通过以下方式将数据从GPU获取到CPU:
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。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- .cpp和.h文件中的模板专用化声明
- 反向给定链表中的K节点
- 正在查找文档以获得PS4平台的C++中的设备信息
- enum是C++中的宏变量还是整数变量
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 给一个图 G 找到此图中的所有节点 blob,以便 node.color 属性 = 特定颜色
- MySQL c++ 连接器:使用 SetBlob() 在查询中设置多个 blob 数据的正确方法是什么?
- 当我调用它来解码 Blob 对象中的 png 图像时,"Magick++::readImages"引发警告
- 错误:使用 tesseract 引擎时 C++ 中的声明'typedef struct tagBLOB BLOB'冲突
- C++驱动程序中 Blob 类型的映射
- Cassandra 中的 blob 数据类型
- 如何在使用 GPU 时更改 Caffe2 中的 blob 值 (C++)
- ODBC c ++(预言机)中的空 blob 插入查询
- 表示C++中的 BLOB
- 将图像作为blob类型插入QT C++中的数据库
- 使用cvblobslib和opencv(c++)减少实时二进制b/w网络摄像头馈送的blob检测过程中的延迟
- 获取存储在blob中的MySQL映像大小
- 在c++中使用OpenCV查找每个blob中的像素数
- mysql数据库c++中存储blob数据的语法