代码之家  ›  专栏  ›  技术社区  ›  Pejvak

在opencl2.0中使用enqueueFillBuffer会产生垃圾

  •  0
  • Pejvak  · 技术社区  · 4 年前

     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, &copyEvent);
      }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 产生垃圾。我不知道为什么。必须提到的是,我用opencl2.0构建数据。

    0 回复  |  直到 4 年前
        1
  •  1
  •   pmdj    4 年前

    原版 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)

    这意味着如果将指针值传递给 排队FillBuffer() ,它将使用 指针值 作为模式,作为指向指针的指针将被传递给OpenCL。这正是您的代码要执行的操作:

    T value = 0;
    //…
    queue.enqueueFillBuffer(intermediateBuffer, &value, 0,
    //               don't pass a pointer here--^^^^^^
    

    & 应该能解决问题。