2017-02-21 105 views
1

在caffe源代码(分支opencl)中,有时我可以看到一些像这些(例如在src/caffe/layers/base_conv_layer.cpp行400中):OpenCL:从'float *'转换为'cl_mem'

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; 

它们的价值是一样的!

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

+0

'(cl_mem)a'是一个演员,而不是一个转换。 – simpel01

+0

@ simpel01感谢评论!所以,实际上这个转换没有什么特别之处,内存中的数据也不会改变。但为什么这个演员在caffe opencl中工作?据我所知,cl_mem和float *很不相同。有没有什么窍门让它工作?谢谢。 – wasd96040501

回答

0

如果你看看SyncedMemory类(在include/caffe/syncedmem.hppsrc/caffe/syncedmem.cpp),你会发现一个内存缓冲区首先由clCreateBuffer创建和手柄存储为cl_mem对象。当gpu_data()mutable_gpu_data()被调用时,句柄被转换成DType*。因此可以将其重新输入cl_mem,因为它首先是一个cl_mem对象。