В исходной функции clEnqueueFillBuffer()
в API OpenCL C шаблон передается в виде пары указателя и размера. В оболочке 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--^^^^^^
Удаление &
должно решить проблему.