Проблема с mkl_free ()

Я пишу программу регистрации изображений и обнаружил странную ошибку при использовании mkl_free (). Я написал реализацию матричной экспоненциальной функции — expm () — из MATLAB с использованием функций MKL. Я проверил его отдельно, и он работает без каких-либо ошибок.

Код можно найти здесь: https://github.com/poliu2s/MKL/blob/master/matrix_exponential.cpp

Проблема возникает, когда я вызываю ее из других функций, которым она нужна для расчета. Моя программа в настоящее время вылетает прямо перед тем, как я вызываю первый mkl_free (), поэтому я подозреваю, что это какая-то утечка памяти. Но не должны ли матрицы, используемые внутри функции, быть самодостаточными? Я не понимаю, как их освобождение приведет к сбою всей моей программы.

Вызовы mkl_free_buffers (); и mkl_thread_free_buffers (); не производит никакого эффекта, который я могу наблюдать. Я попытался отключить Intel Memory Manager с помощью mkl_disable_fast_mm () за счет скорости в начале выполнения программы, но также безрезультатно.

Я проверил входные данные, входящие в саму функцию, и матрица совершенно верна — точно так же, как те, которые я использовал во время тестирования.

Есть ли какая-то причина, почему моя программа зависала, когда я вызываю mkl_free (array) в определенных циклах?

0

Решение

Есть несколько проблем с вашим кодом. Также не обязательно, но потенциально может привести к segfault, но вы должны исправить их при исследовании вашей проблемы.

  • Подпись dcopy:

    void cblas_dcopy (const MKL_INT N, const double * X, const MKL_INT
    incX, double * Y, const MKL_INT incY);

Предполагая, что вы используете функцию MKLS, передавая адрес &один, &sxtn to dcopy — это неправильно. Вы можете писать в любом месте вашей памяти процесса.

Еще два комментария о стиле:

  • Я бы рекомендовал использовать один и тот же тип для входных и выходных переменных факториала, например. unsigned long или unsigned double, но не смешанная подпись для рекурсивной функции.
  • Как пользователь этой функции, я ожидаю, что я отвечаю за выделение памяти для m_exp. Так что я бы, но это в функции подписи. Сравните ваш вызов функции с mkl, вся память, за которую должен позаботиться пользователь, должна позаботиться о нем, и все выделения внутренней памяти выполняются внутренне, не раскрывая ее пользователю, но в вашем случае выделение внутренней памяти для m_exp пользователю. Это может привести к утечке памяти в пользовательском коде.
1

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

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

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