Мы используем класс cv::dnn::Net
из OpenCV для обработки изображений.
Вот структура кода с указанием причины разрыва:
cv::dnn::Net NeuralNetwork;
...
// This works fine since it keeps OpenCV code running on the CPU
// NeuralNetwork.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);
// This change leads to a segmentation fault since it allows OpenCV to use the GPU
NeuralNetwork.setPreferableTarget(cv::dnn::DNN_TARGET_OPENCL);
...
// Segmentation fault occurs here
NeuralNetwork.forward(PredictedBoxesAndMasks, OutputLayerNames);
Ошибка:
В шейдере слишком много инструкций: 689 (максимум 512) Статус -1016: Неизвестная ошибка OpenCL Не удалось скомпилировать ядро: BASIC_k7x7_cn3_g3_s2x2_d1x1_b0_in256x256_p2x2_num1_M8_activ0_eltwise0_FP32_4_1_1_1 (длинный список определений OpenCL) errmsg: Ошибка сегментации
OpenCV распознает графический процессор и возвращает эту информацию:
Имя поставщика: Vivante Corporation Название: Vivante OpenCL Device GC2000.5108.0000 Версия драйвера: OpenCL 1.1 V6.2.4.p4.190076 в наличии: 1 Размер глобальной памяти: 67108864 Размер кеш-памяти: 4096 Тип кеш-памяти: 2 Размер локальной памяти: 1024 Тип локальной памяти: 2 Максимальная тактовая частота: 528
Вопрос:
Как мне ограничить количество инструкций, которые OpenCV / OpenCL пытается передать графическому процессору?
Я не видел, чтобы у других пользователей была эта специфическая c проблема. Я предполагаю, что запуск тяжелых нейронных сетей во встроенных системах не является популярным.
Спасибо за ваше время и помощь!