Ошибка сегментации с использованием FFTW

У меня есть довольно интересная программа, которая использует собственный алгоритм БПФ. Недавно я решил попробовать использовать 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

ИЗМЕНИТЬ

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

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

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


person steveo225    schedule 27.09.2011    source источник
comment
Вы должны выяснить, на какой линии он ошибается, а затем обновить вопрос, добавив дополнительную информацию.   -  person N_A    schedule 27.09.2011
comment
Вы сказали, что это все внутренний код. Это означает, что вы можете выяснить, на какой строке fftwf_plan_dft_1d происходит ошибка seg.   -  person N_A    schedule 27.09.2011
comment
Как только он входит в fftwf_plan_dft_1d, отладчик внезапно останавливается без ошибок или статуса, и если я просматриваю основной файл, он ничего не показывает.   -  person steveo225    schedule 27.09.2011
comment
Пожалуйста, опубликуйте объявление fftwf_plan_dft_1d() и первые строки его реализации.   -  person wallyk    schedule 27.09.2011
comment
Я предполагаю, что если i является size_t, -i не даст вам ожидаемого результата. И посмотрев на шапку fftw3.h, вижу, что ожидают комплекс С99, чего-то с такой же компоновкой. Вы уверены, что std::complex имеет такой же макет/совместим?   -  person paercebal    schedule 27.09.2011
comment
Это код фортрана: type(C_PTR) function fftwf_plan_dft_1d(n,in,out,sign,flags) bind(c,name='fftwf_plan_dft_1d') import integer(C_INT), value :: n complex(C_FLOAT_COMPLEX), dimensions(*), intent(out) :: in и т. д. Хотите еще?   -  person steveo225    schedule 27.09.2011
comment
В paercebal: я не ищу никакого результата, это был просто тест, чтобы увидеть, будет ли он компилироваться и запускаться, результаты бесполезны, я просто не хочу, чтобы он ошибался, и сложный тип должен быть совместим, поскольку они обе являются непрерывной памятью, float[2] и struct { float re, im; }   -  person steveo225    schedule 27.09.2011
comment
Вы проверили, установлен ли для основного файла соответствующий размер с помощью ulimit -c(or -a?)? Иногда, если размер файла дампа равен нулю, файл дампа не выгружается.   -  person Sriram    schedule 28.09.2011
comment
Да, у меня установлено безлимитное   -  person steveo225    schedule 28.09.2011
comment
Возможно, вам придется перекомпилировать FFTW с символами отладки, чтобы увидеть, что происходит. В Linux-подобных системах извлеките исходный дистрибутив FFTW-3.3, cd в извлеченную папку и введите CFLAGS='-g -O0' FFLAGS='-g -O0' ./configure   -  person Daniel Trebbien    schedule 28.09.2011
comment
Я перенастроил с помощью отладки и разместил дополнительную информацию в сообщении. Кроме того, я столкнулся с valgrind приложением, и это не помогло, но я жаловался на те же области в FFTW.   -  person steveo225    schedule 28.09.2011


Ответы (3)


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

person steveo225    schedule 03.10.2011
comment
У меня проблема при интеграции FFTW3 в Apache Spark (с JNI). Если я запускаю свое приложение, используя одно ядро ​​на узел в кластерном режиме или одно ядро ​​на одной машине (локальный режим), все в порядке. Однако, если я запускаю свое приложение, используя два или более ядер на машине, я обнаружил эту проблему: SIGSEGV (0xb) в pc=0x00007ff9007bc5ae, pid=27386, tid=0x00007ff91e1f1700 — Проблемный фрейм: C [libfftw3f.so.3+0x155ae ] fftwf_mkplan+0xe - person Vitrion; 14.03.2019
comment
Не могли бы вы объяснить немного больше, как создать блокировку мьютекса? Спасибо - person Vitrion; 14.03.2019

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

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();
person Bob    schedule 01.08.2018

Я опоздал на 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*.

person Normadize    schedule 20.10.2014
comment
Привет @normadize, я слежу за тобой из-за темы, которую ты начал на форумах WordPress. В комментарии вы упомянули, что qtranslate-slug можно улучшить. Теперь я также поддерживаю его, и мне интересно, какие изменения вы внесли. Извините, что гоняюсь за вами здесь... :) - person pcarvalho; 28.12.2014
comment
Моды наверняка удалят это, но, возможно, вы можете оставить некоторую контактную информацию или написать на мой адрес gmail (то же имя), прежде чем они это сделают. - person Normadize; 28.12.2014