2015-06-05 2 views
0

Я использую OpenCL с обертками C++, используя GPU для тяжелых вычислений.Как передать cl :: Buffer объект между функциями хоста C++?

Данные в cl :: Буферные объекты, например.

std::vector<float> host_z_vec(100, 0.0f); 
cl::Buffer device_z_vec; 
device_z_vec = cl::Buffer(*context_ptr, 
          CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, 
          sizeof(float)*host_z_vec.size(), 
          &host_z_vec.at(0), 
          &status); 

Как передать объект cl :: Buffer, device_z_vec, между функциями хоста C++? - Я не хочу делать копии device_z_vec, просто передаю его.

void run_on_gpu(cl::Buffer device_z_vec){ ... } 

или

void run_on_gpu(const cl::Buffer& device_z_vec){ ... } 

?

И это нормально?

class StoreBuffer{ 
    cl::Buffer device_z_vec; 
public: 
    cl::Buffer provide_access_to_device_z_vec(){ return device_z_vec; }; 
} 

или должен ли я передавать указатель на объект cl :: Buffer?

ответ

1

Передача cl::Buffer на функцию по значению или сохранение ее как члена класса. Конструктор копирования для класса cl::Buffer просто увеличивает счетчик ссылок на базовое распределение OpenCL (через clRetainMemObject). То же самое верно для всех других классов объектов OpenCL в cl.hpp.