2017-02-21 42 views
1

В исходном коде кофейных (филиал OpenCL), иногда я могу увидеть некоторые, как они (например, в И/кофейный/слои/base_conv_layer.cpp линии 400.):OpenCL: преобразование из «флоит *» до «» 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

Если посмотреть в класс SyncedMemoryinclude/caffe/syncedmem.hpp и src/caffe/syncedmem.cpp), вы обнаружите, что буфер памяти первый созданный clCreateBuffer и ручка хранится в виде cl_mem объекта. Затем ручку отливают до типа DType*, когда вызывается gpu_data() или mutable_gpu_data(). Поэтому его можно отбрасывать до типа cl_mem, поскольку это, в первую очередь, объект cl_mem.