Я пытаюсь преобразовать изображение в оттенки серого, используя opencl. Но когда я пытаюсь создать readbuffer. я получаю сообщение об ошибке сегментации, хотя размер буфера находится в пределах памяти устройства. я пробовал ширину = 4000 и высоту = 6000 Это моя функция opencl. В этой строке появляется segfault
cl::Buffer input_buffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(uchar) * width * height * 3, input, &err);
void executeOpenCL(uchar*** input, uchar** output, const int height, const int width)
{
cl_int err;
std::vector<cl::Platform> platforms;
err = cl::Platform::get(&platforms);
cl::Platform platform = platforms[0]; // Choose the first platform
std::vector<cl::Device> devices;
err = platform.getDevices(CL_DEVICE_TYPE_GPU, &devices);
cl::Device device = devices[0]; // Choose the first GPU device
cl::Context context(device);
cl::CommandQueue queue(context, device);
// Create OpenCL buffers for input and output image data
cl::Buffer input_buffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(uchar) * width * height * 3, input, &err);
return;
}
Я пытался проверить, превышает ли размер буфера память хост-устройства, но даже если он находится в пределах допустимого.
Ввод определяется как беззнаковый массив char3d.
uchar*** array3D = new uchar** [height];
for (int i = 0; i < height; ++i) {
array3D[i] = new uchar* [width];
for (int j = 0; j < width; ++j) {
array3D[i][j] = new uchar[3]; // Assuming 3 channels (RGB)
}
}
Такие вопросы следует публиковать с минимальным воспроизводимым примером. Как определяется input
, подходит ли он для данной ширины и высоты?
Выводит ли строка std::cout << i + 1 << ". " << devices[i].getInfo
правильную и ожидаемую информацию?
да. он выводит ожидаемую информацию.
@273K подписался на mre и добавил определение ввода
У вас много err
возвратов после звонка, но вы их не проверяете. По опыту, даже если кажется, что это работает, не проверять их — не лучшая практика, поскольку они могут впоследствии скрыть некоторые побочные эффекты. Можете ли вы cout
получить err
результат и включить его в виде встроенных комментариев после повторного выполнения MRE, просто для наглядности, пожалуйста?
uchar*** array3D = new uchar** [height];
Почему? Я ожидал, что OpenCL будет ожидать наличия непрерывного буфера памяти (а не каких-то разбросанных кусочков памяти повсюду). Например. a std::vector<std::uint8_t,width*height*3> buffer;
(а затем передать buffer.data()
в свой API). Примечание: использование голого нового/удаления больше не рекомендуется в C++.
@TheNomad я проверял их раньше при выполнении кода, но удалил их только из-за mre.
Вот твоя ошибка
uchar*** array3D = new uchar** [height];
for (int i = 0; i < height; ++i) {
array3D[i] = new uchar* [width];
for (int j = 0; j < width; ++j) {
array3D[i][j] = new uchar[3]; // Assuming 3 channels (RGB)
}
}
Это должен быть непрерывный буфер памяти
uchar* array3D = new uchar[width * height * 3];
я сделал это, но все равно получаю ту же ошибку
«Я сделал это» очень расплывчато, покажите минимальный воспроизводимый пример того, что вы сделали.
эта строка cl::Buffer input_buffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(uchar) * width * height * 3, input, &err);