OpenCL:写入现有的cl :: Buffer?

时间:2018-01-29 22:08:18

标签: opencl

我碰巧有一个库已经在OpenCL内部给了我一个GPU Ptr。

auto* gpuImagePtr = upImpl->upCaffeNet->blobs().at(0)->mutable_gpu_data();
cl::Buffer imageBuffer = cl::Buffer((cl_mem)gpuImagePtr);

我想将数据写入imageBuffer指向的指针,而不分配新的内存。我怎么会这样做?如果我实例化一个cl :: Buffer,它只会写一个新地址。我不想写一个内核来做这件事。

在CUDA我会这样做

auto* gpuImagePtr = upImpl->upCaffeNet->blobs().at(0)->mutable_gpu_data();
cudaMemcpy(gpuImagePtr, inputData.getConstPtr(), inputData.getVolume() * sizeof(float),
                               cudaMemcpyHostToDevice);

在OpenCL中,我尝试过这样做,但它只是段错误:

auto* gpuImagePtr = upImpl->upCaffeNet->blobs().at(0)->mutable_gpu_data();
cl::Buffer imageBuffer = cl::Buffer((cl_mem)gpuImagePtr);
op::CLManager::getInstance(upImpl->mGpuId)->getQueue().enqueueWriteBuffer(imageBuffer, true, 0, inputData.getVolume() * sizeof(float), inputData.getConstPtr());

1 个答案:

答案 0 :(得分:1)

好的,事实证明我需要使用retain标志:

cl::Buffer imageBuffer = cl::Buffer((cl_mem)gpuImagePtr, true);

现在它不再崩溃了