OpenCL:从'float *'转换为'cl_mem'

时间:2017-02-21 06:05:47

标签: c++ opencl caffe

在caffe源代码(分支opencl)中,有时我可以看到类似这些(例如在src / caffe / layers / base_conv_layer.cpp第400行):

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

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

我觉得这很奇怪,所以我用Google搜索了一下,但对此一无所知。

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

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

他们的价值是一样的!

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

1 个答案:

答案 0 :(得分:0)

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