LINUX.ORG.RU

альтернатива mmap и malloc для fftw


0

1

дорогой ЛОР!

Мне нужно сделать 3-мерное фурье-преобразование массива с длиной «стороны» порядка 1024 точек (в перспективе было бы здорово и побольше). В распоряжении имеется ПК с 4 Гигабайтами памяти и core-i5. Я попробовал сделать это с помощью библиотеки fftw. Практически удалось решить эту задачку для массива с длиной «стороны» 512 точек, больше просто не влезает в ОЗУ. В 4 потока фурье делается секунд за 20, что мне очень нравится!

Однако простые прикидки показывают, что для размещения fftw_complex требуемых мне размеров нужно 16 гигабайт ОЗУ, которых у меня нет :( Я попробовал размещать входной массив в файле с помощью процедуры mmap, но это очень сильно замедляет работу программы :(

Нет ли у моей задачки какого-нибудь более простого решения? (помимо сборки суперкомпьютера в домашних условиях) Пока не очень хочется отказываться от fftw, поэтому вопрос - можно ли как-то более разумно подойти к размещению большого массива в ОЗУ + на диске? Или как-нибудь делать фурье по частям, копируя их в ОЗУ из файла большими блоками?

PS. К сожалению у задачки нет никакой симметрии, что может быть как-то могло бы упростить её решение.

PPS. Приветствуются любые мысли и ключевые слова, особенно если кто-то имел похожий опыт...

mmap это самый оптимальный способ, лучше что-то придумать сложно. Ставь память 4 планки по 4 гига. Ни какой это не суперкомпьютер будет по современным меркам, а так, рядовая машина.

Reset ★★★★★
()

Боюсь, без сохранения промежуточных результатов на диск или увеличения размера оперативки гигабайт до 20-30 вам не обойтись...

Кстати, а для чего вам трехмерное Фурье? Может, можно другими методами с вашей задачей справится?

Eddy_Em ☆☆☆☆☆
()

FFT можно разбивать на части, считать каждую в памяти и потом сливать вместе (ссылок на алгоритмы не дам, несложно нагуглить). Ещё можно использовать 4х байтные float вместо 8и байтных double

anonymous
()

Если делать это на 64-битной системе, то не надо никаких mmap вручную. При нехватке памяти будет использоваться swap обычным образом. Естественно, будет медленно, но не медленнее искуственного сохранения в файл. А если хотите быстро, то или бейте задачу на части (как уже предложили), или докупайте память. Большому кораблю - большое плаванье.

Deleted
()

Ну, если трехмерный массив хорошо сжимается (наверняка там много нулей или просто одинаковых членов), возможно имеет смысл реализовать свой контейнер для входных и выходных данных (наподобие разреженных матриц) и набылдокодить свою реализацию ффт. Свой ффт будет, конечно, медленней, но если все влезет в память, производительность вырастет в разы. Теоретически.

Другое дело, что пара планок памяти, скорее всего, окажется дешевле.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.