Грешка в сегментирането с помощта на FFTW

Имам доста ангажираща програма, която използва вътрешен 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

РЕДАКТИРАНЕ

Преконфигурирах 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
Трябва да разберете на кой ред е грешката на seg и след това да актуализирате въпроса с повече информация.   -  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, виждам, че очакват комплекс C99, от нещо със същото оформление. Сигурни ли сте, че std::complex има същото оформление/е съвместим?   -  person paercebal    schedule 27.09.2011
comment
Това е Fortran код: 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), функциите за създаване на план не са. Това не обяснява напълно защо самото провеждане на тест при стартиране се провали, но когато екскапсулирах създаването на план в заключвания на mutex, грешките в сегментирането престанаха.

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
Бихте ли обяснили малко повече как да създадете заключване на mutex? Благодаря ти - 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
Mods със сигурност ще изтрият това, но може би можете да оставите малко информация за връзка или да пишете на моя gmail адрес (със същото име), преди да го направят. - person Normadize; 28.12.2014