OpenCL.Net Запись буферов большого объема в память видеокарты

Тема в разделе "OpenCL", создана пользователем Yuriy1301, 19 апр 2024.

Метки:
  1. Yuriy1301

    Yuriy1301 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2024
    Сообщения:
    2
    Здравствуйте!
    Начал изучать OpenCl. Использую OpenCL.Net. Видеокарта RTX 3060 c 12 Гб памяти.
    При использовании буферов данных небольшого объема (4 буфера по 3200 байт каждый) программа работает, если увеличить объем (например до 128000 байт) при вызове EnqueueWriteBuffer возникает ошибка: "попытка чтения или записи в защищённую память".
    При этом параметр MaxMemAllocSize - 1 073 905 664 байт (максимальный размер одного буфера) значительно превосходит объемы данных, которые я использовал.
    Кто-нибудь сталкивался с такой проблемой?
    Если делаю что-то неправильно прошу простить, я только начал изучать OpenCL.
     

    Вложения:

  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.553
    Адрес:
    Russia
    Скорее всего проблема кроется тут
    Cl.CreateBuffer<float>
    Cl.EnqueueWriteBuffer<float>
    А именно в шаблоне параметра.
    Убедитесь что там размер передается в байтах а не в элементах.
    иначе получается что исходный массив будет меньшего размера
     
    Mikl___ нравится это.
  3. Yuriy1301

    Yuriy1301 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2024
    Сообщения:
    2
    Большое Вам спасибо за ответ.
    Решение нашел.
    При вызове функции создания буфера, размер буфера - Siz_Mas соответствует размеру в байтах.
    bufferForInputVx = Cl.CreateBuffer<float>(_context, MemFlags.ReadWrite, Siz_Mas, out error);
    При копировании в память видеокарты:
    error = Cl.EnqueueWriteBuffer<float>(OpenCl_CommandQueue, bufferForInputVx, OpenCL.Net.Bool.True, 0,
    (Siz_Mas + 1),
    V_x, 0, null, out eventWriteBufferVx);
    размер нужно увеличить на 1 байт (Siz_Mas + 1) в этом случае ошибка не возникает. С чем это связано я не разобрался,
    нужно хорошо изучить документацию, но такой вариант работает при работе с большим объемом данных.