Почему host_row_pitch не должно быть меньше region [0] в clEnqueueWriteBufferRect - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу записать данные с хоста на устройство в openCL, используя clEnqueueWriteBufferRect. Я использовал код ниже

int deviceWidth = roundUp(width_x, WGX); \\rounup width_x to the first multiply of WGX
int deviceHeight = height_x;
int deviceDataSize = deviceWidth * deviceHeight * sizeof(float);
buffer_x = cl::Buffer(context, CL_MEM_READ_ONLY,  deviceDataSize);

cl::size_t<3> buffer_origin;
  buffer_origin[0] = 0;
  buffer_origin[1] = 0;
  buffer_origin[2] = 0;

  cl::size_t<3> host_origin;
  host_origin[0] = 0;
  host_origin[1] = 0;
  host_origin[2] = 0;

  cl::size_t<3> region;
  region[0] = (size_t)(deviceWidth * sizeof(float));
  region[1] = (size_t)height_x;
  region[2] = 1;

  std::cout << "===> Start writing data to device" << std::endl;
    queue.enqueueWriteBufferRect(buffer_x, CL_TRUE, buffer_origin, host_origin, region ,deviceWidth_x * sizeof(float), 0, width_x * sizeof(float), 0, x);

x имеет размерность width_x * height_x. и когда я запускаю код, я получаю ошибку CL_INVALID_VALUE. Причина проблемы в region[0] > host_row_pitch. Но я не могу понять причину ограничения, так как обычно область в хосте меньше, чем область в устройстве, то есть вы хотите скопировать данные с хоста в середину устройства с отступом. Поэтому область в памяти хоста может быть меньше, чем область в устройстве. Я не прав?

...