Ошибка сегментации с использованием FFTW - PullRequest
1 голос
/ 27 сентября 2011

У меня есть довольно привлекательная программа, которая использует внутренний алгоритм FFT. Недавно я решил попробовать использовать FFTW для повышения производительности. В качестве простого теста, чтобы убедиться, что FFTW будет связывать и запускать, я добавил следующий код в начало приложения, однако при запуске я получаю ошибку сегментации при создании fftwf_plan:

const size_t size = 1024;
vector<complex<float> > data(size);
for(size_t i = 0; i < size; ++i) data[i] = complex<float>(i, -i);

fftwf_plan plan =
    fftwf_plan_dft_1d(size,
                      (fftwf_complex*)&data[0],
                      (fftwf_complex*)&data[0],
                      FFTW_FORWARD,
                      FFTW_ESTIMATE);
// ^ seg faults here ^

fftwf_execute(plan);
fftwf_destroy_plan(plan);

Есть идеи, что может быть причиной этого?

Использование FFTW 3.3. Пробовал 2 разных компилятора, g ++ 4.1.1 и icc 11.1. Кроме того, файл основного файла не показывает ничего значимого:

Thread 1.1: Error at 0x00000000
Stack Trace: PC: 000000, FP=Hex Address

EDIT

Я перенастроил FFTW для добавления отладки, используя следующие команды:

setenv CFLAGS "-fPIC -g -O0"
configure --enabled-shared --enable-float --enable-debug
make
make install

Когда программа имеет ошибку сегментации, она находится в случайном месте в методе fftwf_plan_dft_1d(), однако трассировка стека всегда показывает, что находится внутри или ниже функции search, которая вызывается mkplan.

Ответы [ 3 ]

2 голосов
/ 03 октября 2011

Очевидно, что проблема связана с многопоточностью.Хотя основные функции в FFTW являются поточно-ориентированными (например, fftwf_execute), функции для создания плана - нет.Это не полностью объясняет, почему просто запустить тест при запуске не удалось, однако, когда я исключил создание плана в мьютекс-блокировках, ошибки сегментации прекратились.

1 голос
/ 01 августа 2018

Создание и уничтожение планов должны быть однопоточными

fftw_init_threads();
#pragma omp parallel for
for(i=0;i<n;i++) {
   #pragma omp critical {
     plan = fftw_create_plan....
   }
   fftw_execute(plan); // or the fftw_execute_dft for multiple in/out fft operations
   #pragma omp critical {
     fftw_destroy_plan(plan);
   }
}
fftw_cleanup_threads();
0 голосов
/ 20 октября 2014

Я опоздал на 3 года, но я наткнулся на очень похожую проблему, в том числе и при использовании многопоточности (--enable-openmp и fftw_plan_with_nthreads(omp_get_max_threads())).Ошибка моего сега на fftw_destroy_plan(p).

Оказалось, что я не обращал внимания при реструктуризации своего кода, и я звонил fftw_cleanup_threads(), прежде чем позвонить fftw_destroy_plan(p) ... глупо, я знаю, ноэто заставило меня гоняться за хвостом в течение 1 часа.

При использовании многопоточности fftw_cleanup_threads() должен вызываться после всех функций fftw *, так же как fftw_init_threads() должен вызываться перед любой функцией fftw *.

...