Clenqueuereadbuffer не присваивает буферу cl_mem все значения, которые указывают на данные std::vector
Я пытаюсь скомпилировать проект opencl, где я ожидаю, что выходной буфер будет назначен через объект cl_mem, но когда clEnqueueReadBuffer выполняет std::vector<color> элементы в массиве не назначаются
исходный код хоста на языке c++ выглядит следующим образом:
cl_mem originalPixelsBuffer = clCreateBuffer(p1.context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, sizeof(Color) * imageObj->SourceLength(), source, &p1.status); CheckErrorCode(p1.status, p1.program, p1.devices[0], "Failed to Create buffer 0"); cl_mem targetBuffer = clCreateBuffer(p1.context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, sizeof(Color) * imageObj->OutputLength(), target, &p1.status); CheckErrorCode(p1.status, p1.program, p1.devices[0], "Failed to Create buffer 1"); //write buffers p1.status = clEnqueueWriteBuffer(p1.commandQueue, originalPixelsBuffer, CL_FALSE, 0, sizeof(Color) * imageObj->SourceLength(), source, 0, NULL, NULL); CheckErrorCode(p1.status, p1.program, p1.devices[0], "Failed to write buffer 0"); p1.status = clEnqueueWriteBuffer(p1.commandQueue, targetBuffer, CL_TRUE, 0, sizeof(Color) * imageObj->OutputLength(), target, 0, NULL, NULL); CheckErrorCode(p1.status, p1.program, p1.devices[0], "Failed to write buffer 1"); size_t globalWorkSize[2] = { imageObj->originalWidth * 4, imageObj->originalHeight * 4 }; size_t localWorkSize[2]{ 64,64 }; SetLocalWorkSize(IsDivisibleBy64(localWorkSize[0]), localWorkSize); //execute kernel p1.status = clEnqueueNDRangeKernel(p1.commandQueue, Kernel, 1, NULL, globalWorkSize, IsDisibibleByLocalWorkSize(globalWorkSize, localWorkSize) ? localWorkSize : NULL, 0, NULL, NULL); CheckErrorCode(p1.status, p1.program, p1.devices[0], "Failed to clEnqueueDRangeKernel"); //read buffer p1.status = clEnqueueReadBuffer(p1.commandQueue, targetBuffer, CL_TRUE, 0, sizeof(Color) * imageObj->OutputLength(), target, 0, NULL, NULL); CheckErrorCode(p1.status, p1.program, p1.devices[0], "Failed to write buffer 1");
код ядра:
__kernel void interp(__global struct Color* source,__global struct Color* target,uint64 width,uint64 height,uint64 ratio,uint64 limit, uint64 originalHeight) { __private fp32 wIndex = (int64)get_global_id(0); __private fp32 hIndex = (int64)get_global_id(1); if(((int64)wIndex)%ratio==MATCH && ((int64)hIndex)%ratio ==MATCH) { __private int64 Index = (wIndex/ratio) * (originalHeight/ratio) + (hIndex/ratio); if(Index < limit) { __private int64 tIndex = wIndex * height + hIndex; target[tIndex].R = source[Index].R; target[tIndex].G = source[Index].G; target[tIndex].B = source[Index].B; target[tIndex].A = source[Index].A; } } }```
Что я уже пробовал:
Я пробовал использовать `
CL_MEM_USE_HOST_PTR` и
CL_MEM_COPY_HOST_PTRно CL_MEM_COPY_HOST_PTR занимает слишком много времени для выполнения.
Richard MacCutchan
Код для clEnqueueReadBuffer
не полный. Вам также нужно более подробно объяснить, что происходит или должно произойти в той части, которая не дает правильных результатов.
PontiacGTX
вот этот проект:
источник
что он делает: установите только первый элемент в std::vector<color>*
что он должен делать: установить все элементы на основе ядра
но я не знаю, почему он не работает так, как ожидалось, и если использовать CL_MEM_COPY_HOST_PTR, то это займет слишком много времени для обработки