Я хочу записать данные с хоста на устройство в 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
. Но я не могу понять причину ограничения, так как обычно область в хосте меньше, чем область в устройстве, то есть вы хотите скопировать данные с хоста в середину устройства с отступом. Поэтому область в памяти хоста может быть меньше, чем область в устройстве. Я не прав?