Přidělit 3D Pole pro FFTW pomocí fftw_malloc

0

Otázka

Já jsem v současné době snaží zlepšit výkon vícevláknových FFTW provádění. V dokumentaci fftw3 jsem četl, že pro nejlepší možný výkon, fftw_malloc funkce by měla být použita k přidělení v - a výstup dat z DFT.

Od té doby jsem jednání s velkými 3D pole velikost 256*256*256 musím je vytvořit na haldě s

const unsigned int RES = 256;

std::complex<double>(*V)[RES][RES];
V = new std::complex<double>[RES][RES][RES];

A po inicializaci jsem vytvořit vícevláknové (in-place) fftw_plans pro 3D DFT transformace podle

int N_Threads = omp_get_max_threads();
fftw_init_threads();
fftw_plan_with_nthreads(N_Threads);

fftw_complex *input_V = reinterpret_cast<fftw_complex*>(opr.V);
fftw_plan FORWARD_V = fftw_plan_dft_3d(RES, RES, RES, input_V, input_V, FFTW_FORWARD, FFTW_MEASURE);
fftw_plan BACKWARD_V = fftw_plan_dft_3d(RES, RES, RES, input_V, input_V, FFTW_BACKWARD, FFTW_MEASURE);

Má otázka nyní je: Jak mohu vytvořit tyto plány pomocí fftw_malloc místo toho ?

V fftw3 dokumentace mohu jen najít

fftw_complex *in;
in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);

což chápu jako 1D příklad. Mám projekt moje 3D pole nebo je použití fftw_malloc není možné/vhodné v tomto případě?

3d arrays c++ fftw
2021-11-23 18:51:29
1

Nejlepší odpověď

1

malloc a jeho bratranci (jako je vaše fftw_malloc) přidělit jeden rozměrné nárazníky, takže ve vašem případě to, co chcete, je vytvořit vyrovnávací paměť dostatečně velká, aby držet své trojrozměrné údaje:

fftw_malloc(sizeof(fftw_complex) * RES * RES * RES);

Četl jsem, že pro nejlepší možný výkon, fftw_malloc funkce by měla být použita

Je důležité se ptát "proč", kdykoli budete vidět prohlášení, jako že. Konkrétně nezúčastněných prostředků vynakládat stránkování trest, tak to malloc varianta se snaží přidělit souladu paměti. Není to magie, a můžete určitě udělat sám, stejně, například pomocí aligned_alloc.

2021-11-23 19:15:52

Díky moc za vaši odpověď. Jen se ujistit, že jsem to pochopil správně: S fftw_malloc velení bych přidělit paměť, ale to by ještě musel inicializovat. Takže vytvořit plán, tak by měl také změnit svůj V[RES][RES][RES] pole do jediného-dimenzionální row-major formátu , jako je to fftw_malloc?
Azure27

Jo, bude to v podstatě dělat multi-dimenzionální indexování ručně, nebo s pomocnou funkcí.
Blindy

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................