c++ - OpenCL:从 ' float* ' 到 ' cl_mem ' 的转换

标签 c++ opencl caffe

在 caffe 源代码(分支 opencl)中,有时我可以看到这样的一些(例如在 src/caffe/layers/base_conv_layer.cpp line 400):

void func(cl_mem a, ...)
{...}

void func2(float* a, ...)
{
    ...
    func( (cl_mem) a, ...);
    ...
}

我觉得这很奇怪,所以我用谷歌搜索了一下,但一无所获。

然后我写了一个简单的测试代码来弄清楚发生了什么,但是我发现这个转换是没有意义的:

std::cout << long((void*)a) << " " << long((void*)(cl_mem(a))) << std::endl;

他们的值(value)是一样的!

所以我的问题是为什么这种转换在 caffe opencl 中没有问题? 此转换中发生了什么?

最佳答案

如果您查看 SyncedMemory 类(在 include/caffe/syncedmem.hppsrc/caffe/syncedmem.cpp 中),您会发现clCreateBuffer首先创建了一个内存缓冲区,并将句柄存储为一个cl_mem对象。然后在调用 gpu_data()mutable_gpu_data() 时将句柄转换为 DType* 类型。因此它可以转换回 cl_mem 类型,因为它首先是一个 cl_mem 对象。

关于c++ - OpenCL:从 ' float* ' 到 ' cl_mem ' 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42359848/

相关文章:

c++ - (Visual-)字符串文字的 C++ 模板类型推断 - VS 2010 与 VS 2017

c++ - 条件运算符用法

c++ - Glew - 与 GLFW 配对时 gl- 函数符号的链接错误

opencl - 是否可以让 AMD APP Profiler 与 C#/Cloo 一起使用?

queue - OpenCL 事件和命令队列

python - caffe python 手册 sgd

c++ - Qt 使用哪种图形技术来呈现其自定义 UI?

c - 压缩列存储中的稀疏矩阵与列 vector 的乘法

machine-learning - 推理时间取决于参数数量吗?

ubuntu - 在 Ubuntu 上安装 Caffe 时出错 - 仅限 CPU