У меня есть программа C ++, которая использует общую библиотеку C (а именно Darknet) загружать и использовать легкие нейронные сети.
Программа работает безупречно под Ubuntu Trusty на коробке x86_64, но вылетает из-за ошибки сегментации под той же ОС, но на устройстве ARM. Причина сбоя заключается в том, что calloc возвращает NULL во время выделения памяти для массива. Код выглядит следующим образом:
l.filters = calloc(c * n * size * size, sizeof(float));
...
for (i = 0; i < c * n * size * size; ++i)
l.filters[i] = scale * rand_uniform(-1, 1);
Итак, после попытки написать первый элемент, приложение останавливается с segfault.
В моем случае объем выделяемой памяти составляет 4,7 МБ, тогда как доступно более 1 ГБ. Я также попытался запустить его после перезагрузки, чтобы исключить фрагментацию кучи, но с тем же результатом.
Что еще интереснее, когда я пытаюсь загрузить большую сеть, она работает просто отлично. И две сети имеют одинаковую конфигурацию уровня, для которого происходит сбой …
Вальгринд не говорит мне ничего нового:
==2591== Invalid write of size 4
==2591== at 0x40C70: make_convolutional_layer (convolutional_layer.c:135)
==2591== by 0x2C0DF: parse_convolutional (parser.c:159)
==2591== by 0x2D7EB: parse_network_cfg (parser.c:493)
==2591== by 0xBE4D: main (annotation.cpp:58)
==2591== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==2591==
==2591==
==2591== Process terminating with default action of signal 11 (SIGSEGV)
==2591== Access not within mapped region at address 0x0
==2591== at 0x40C70: make_convolutional_layer (convolutional_layer.c:135)
==2591== by 0x2C0DF: parse_convolutional (parser.c:159)
==2591== by 0x2D7EB: parse_network_cfg (parser.c:493)
==2591== by 0xBE4D: main (annotation.cpp:58)
==2591== If you believe this happened as a result of a stack
==2591== overflow in your program's main thread (unlikely but
==2591== possible), you can try to increase the size of the
==2591== main thread stack using the --main-stacksize= flag.
==2591== The main thread stack size used in this run was 4294967295.
==2591==
==2591== HEAP SUMMARY:
==2591== in use at exit: 1,731,358,649 bytes in 2,164 blocks
==2591== total heap usage: 12,981 allocs, 10,817 frees, 9,996,704,911 bytes allocated
==2591==
==2591== LEAK SUMMARY:
==2591== definitely lost: 16,645 bytes in 21 blocks
==2591== indirectly lost: 529,234 bytes in 236 blocks
==2591== possibly lost: 1,729,206,304 bytes in 232 blocks
==2591== still reachable: 1,606,466 bytes in 1,675 blocks
==2591== suppressed: 0 bytes in 0 blocks
==2591== Rerun with --leak-check=full to see details of leaked memory
==2591==
==2591== For counts of detected and suppressed errors, rerun with: -v
==2591== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 402 from 8)
Killed
Я действительно смущен, что может быть причиной. Кто-нибудь может мне помочь?
Задача ещё не решена.
Других решений пока нет …