我用下面的代码
cl::Buffer intermediateBuffer = cl::Buffer(context, CL_MEM_READ_WRITE,
distDeviceWidth * distDeviceHeight * distDeviceDepth * sizeof(T));
cl::Event copyEvent;
T value = 0;
try
{
queue.enqueueFillBuffer(intermediateBuffer, &value, 0,
distDeviceWidth * distDeviceHeight * distDeviceDepth * sizeof(T),
NULL, ©Event);
}catch (const cl::Error& error)
{
std::cout << " -> Prolongation class, Problem in enqueue fill buffer" << std::endl;
std::cout << " -> " << getErrorString(error) << std::endl;
exit(0);
}
try
{
queue.finish();
}catch (const cl::Error& error)
{
std::cout << " -> Prolongation class, Problem in finishing fill buffer" << std::endl;
std::cout << " -> " << getErrorString(error) << std::endl;
exit(0);
}
copyEvent.wait();
但是,当我从设备读取数据并将其打印在主机上时,函数
enqueueFillBuffer
会生成垃圾。我不知道为什么需要提及的是我使用openCL 2.0构建数据。 最佳答案
在OpenCL C API的原始clEnqueueFillBuffer()
函数中,该模式作为一对指针和大小传递。在C++包装器enqueueFillBuffer()
中,模式被简化为一个参数,其处理方式如下:
template<typename PatternType>
cl_int enqueueFillBuffer(
const Buffer& buffer,
PatternType pattern,
::size_t offset,
::size_t size,
const VECTOR_CLASS<Event>* events = NULL,
Event* event = NULL) const
{
cl_event tmp;
cl_int err = detail::errHandler(
::clEnqueueFillBuffer(
object_,
buffer(),
static_cast<void*>(&pattern),
sizeof(PatternType),
注意包装器如何在内部获取传递的模式数据的地址(
&pattern
)并自动推断出大小。 (sizeof(PatternType)
)这意味着如果将指针值传递给
enqueueFillBuffer()
,它将使用指针值作为模式,因为指向指针的指针将传递给OpenCL。这正是您的代码似乎正在做的事情:T value = 0;
//…
queue.enqueueFillBuffer(intermediateBuffer, &value, 0,
// don't pass a pointer here--^^^^^^
删除
&
应该可以解决问题。关于c++ - 在openCL 2.0中使用enqueueFillBuffer会产生垃圾,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61517334/