OpenCL выдает ошибку сегментации при создании буфера

Я пытаюсь преобразовать изображение в оттенки серого, используя 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)
        }
    }

эта строка cl::Buffer input_buffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(uchar) * width * height * 3, input, &err);

Ahmad Rafiq 05.05.2024 18:47

Такие вопросы следует публиковать с минимальным воспроизводимым примером. Как определяется input, подходит ли он для данной ширины и высоты?

3CxEZiVlQ 05.05.2024 18:59

Выводит ли строка std::cout << i + 1 << ". " << devices[i].getInfo правильную и ожидаемую информацию?

TheNomad 05.05.2024 18:59

да. он выводит ожидаемую информацию.

Ahmad Rafiq 05.05.2024 19:00

@273K подписался на mre и добавил определение ввода

Ahmad Rafiq 05.05.2024 19:09

У вас много err возвратов после звонка, но вы их не проверяете. По опыту, даже если кажется, что это работает, не проверять их — не лучшая практика, поскольку они могут впоследствии скрыть некоторые побочные эффекты. Можете ли вы cout получить err результат и включить его в виде встроенных комментариев после повторного выполнения MRE, просто для наглядности, пожалуйста?

TheNomad 05.05.2024 19:13
uchar*** array3D = new uchar** [height]; Почему? Я ожидал, что OpenCL будет ожидать наличия непрерывного буфера памяти (а не каких-то разбросанных кусочков памяти повсюду). Например. a std::vector<std::uint8_t,width*height*3> buffer; (а затем передать buffer.data() в свой API). Примечание: использование голого нового/удаления больше не рекомендуется в C++.
Pepijn Kramer 05.05.2024 19:14

@TheNomad я проверял их раньше при выполнении кода, но удалил их только из-за mre.

Ahmad Rafiq 05.05.2024 19:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот твоя ошибка

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];

я сделал это, но все равно получаю ту же ошибку

Ahmad Rafiq 05.05.2024 19:32

«Я сделал это» очень расплывчато, покажите минимальный воспроизводимый пример того, что вы сделали.

3CxEZiVlQ 05.05.2024 19:39

Другие вопросы по теме