Ошибка Calloc на устройстве ARM

У меня есть программа 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

Я действительно смущен, что может быть причиной. Кто-нибудь может мне помочь?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]