Linuxos többszálúságot támogató FFT könyvtárat keresek C++-hoz

 ( Gemini | 2013. július 12., péntek - 22:07 )

Sziasztok,

Olyan FFT könyvtárat keresek C++-hoz, amely jól támogatja a többszálúságot is.
A legfontosabb az lenne, hogy támogassa a 2 dimenziós komplex FFT-t.
A fejlesztést jelenleg Ubuntu Linuxon végzem.
Valami az FFTW-hez hasonló dologra lenne szükségem...

Tudtok valami bevált könyvtárat ajánlani?

Üdv, G

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Én úgy tudom, hogy a 2d FFT-t viszonylag könnyen vissza lehet vezetni 1d-re. Lehet, hogy ezt a visszavezetést magadnak kell megcsinálni persze.

Az FFTW nem tud többszálúságot? Itt azt írja, hogy tud: http://www.fftw.org/parallel/parallel-fftw.html

Miért fontos a többszálúság amúgy?

Elvileg támogat openmp-t meg multithread-et is az FFTW. Le is fordítottam a megfelelő opciókkal. De valahogy nem akar többszálúan működni.

A többszálúság azért fontos, mert viszonylag nagy mennyiségű adaton kb 4k*4k-n kell elvégezni majd több tízezerszer, oda vissza az fft-t az általam megvalósítani kívánt algoritmussal. Egy 2 térdimenziós PDE-t akarok szimulálni egy fourrier alapú módszerrel.

--
Dropbox:
Dropbox
Ubuntu One

Többször fordítottam és használtam FFTW-t, sosem volt probléma a többszálúsággal. Mi lenne, ha leírnád, hogy hogyan fordítottad és hogyan használod? Könnyebb lenne, mint találgatni.

Ubuntu 12.04-en próbáltam a következőket.

Az FFTW fordítása előtt, az alábbiak szerint configoltam:

./configure --prefix=/opt/usr --enable-threads=yes --enable-openmp=yes --enable-sse2=yes
make
make install

A fordítani kívánt c-s programrészlettel próbálkoztam...

#include
#include
#include
#include
#include
#include "/opt/usr/include/fftw3.h"

int main ()
{
int error_threads;

error_threads = fftw_init_threads();

printf ("%d", error_threads);

fftw_plan_with_nthreads(4);
...
fftw_plan p;

u = (fftw_complex *) fftw_malloc(grid_r * grid_theta * sizeof(fftw_complex));

p = fftw_plan_dft_2d(grid_r, grid_theta, u, Fu, -1, FFTW_ESTIMATE );

fftw_execute(p);
...
fftw_cleanup_threads();

fftw_free (u);
}

A fftw_init_threads() visszatérési érték 1, tehát vmi nem kóser... A további részekben a

A programot a következő módon próbáltam meg lefordítani:

gcc -Wall -O3 -std=c99 -I/opt/usr -c 2d-split-step-FFT.c
gcc -Wall -O3 -fopenmp -L/opt/usr/lib/ -o 2dFFT -lfftw3 -lfftw3_omp -lm 2dFFT.c

próbálkoztam még a következő módon is, de az se járt sikerrel:

gcc -Wall -O3 -L/opt/usr/lib -o 2dFFT -lfftw3_threads -lfftw3 -lm -lpthread

Előre is köszönöm a segítséged.
--
Dropbox:
Dropbox
Ubuntu One

A fftw_init_threads() visszatérési érték 1, tehát vmi nem kóser... A további részekben a

RTFM (fftw documentation):

Second, before calling any FFTW routines, you should call the function:

     int fftw_init_threads(void);

This function, which need only be called once, performs any one-time 
initialization required to use threads on your system. It returns zero if 
there was some error (which should not happen under normal 
circumstances) and a non-zero value otherwise.

Az fftw_init_threads() visszateresi erteke egy boolean, ahol a TRUE jelentese az, h minden oke.

---
pontscho / fresh!mindworkz

okes, koszonom, elneztem tenyleg...

--
Dropbox:
Dropbox
Ubuntu One

A fftw_init_threads() visszatérési érték 1, tehát vmi nem kóser...
Az nem koser, hogy nem olvasod el a dokumentaciot :p

lol Pontscho gyorsabb volt...

Azért kérdeztem, hogy miért fontos, mert ha esetleg nem csak ugyanazon az adaton kell oda-vissza dolgozni, hanem párhuzamosan meglévő adataid vannak, akkor elindíthatsz egyszerre több adatra párhuzamosan - több szálon - több transzformációt. Így a párhuzamosítást magasabb szinten végzed el. A körülményektől függően akár nagyobb áteresztőképességet is el lehet így érni talán. Érdemes végiggondolni.

Van egy olyan resze a kodnak, ahol lenne ket fuggetlen vissza transzformacio

Hogy lehet FFTW-vel parhuzamosan megoldani ezt a vissza transzformaciot?

--
Dropbox:
Dropbox
Ubuntu One

Ha két külön szálon indítasz el két egyszálú transzformációt egyszerre, akkor egymás zavarása nélkül fognak lefutni. (Kivéve ha valamiért nem thread safe a könyvtár.)