2015-10-28 3 views
1

Я пытаюсь запустить реализованную реализацию галоида FFT here для сравнения с FTTW. Я могу запустить реализацию как есть, но я столкнулся с некоторыми проблемами при копании немного глубже. Подпрограмма выходит из строя с ошибками для разных значений H и W (высота и ширина случайного входного изображения). Например, я получаю следующее сообщение об ошибке с H = W = 5:Ошибки реализации Halide FFT?

Error at ./fft.cpp:603: Cannot vectorize dimension n0 of function v_S1_R5$6 because the function is scheduled inline. Aborted (core dumped)

Я пытаюсь проверить на небольших размерах изображения (т.е. 5х5), чтобы сравнить результаты алгоритмов, но я могу 'получить алгоритм для завершения для любых значений менее 16, что даже в этой точке делает проверку значений длинной задачей. БПФ также терпит неудачу при значениях, превышающих 32, по-видимому, не работает для всех недействительных 2.

Неужели кто-нибудь сталкивался с этим вопросом раньше? Существуют ли какие-либо другие реализации БПФ в галогенидах, которые работают для изображений разного размера?

Для справки, я запускаю код на RHEL7 с использованием gcc 4.8.3.

ответ

2

Я думаю, что есть несколько проблем. Во-первых, существует ошибка для очень маленьких БПФ, которые используют только один проход. Я думаю, это то, что вы попали в свой первый случай.

Вторая проблема заключается в том, что W и H должны быть кратными векторному размеру вашей цели, не обязательно, что W и H должны быть мощностью 2. Например, W = 48, H = 32 кажется работать на меня. Есть еще одно осложнение, что для реальных БПФ одно измерение получает внутреннее сокращение пополам (это то, как реализованы эффективные реальные БПФ), поэтому, если вы находитесь на машине AVX, это измерение должно быть кратным 16 (2x ширина вектора 8 поплавков).

Если вы хотите запускать на очень маленьких БПФ, вы можете удалить директивы планирования векторизации, тогда он должен работать, по крайней мере, для учебных целей.

Тем не менее, я хотел бы указать, что запуск 5x5 не будет очень интересным, потому что это будет сделано только в одном радиусе 5-го прохода, то есть просто в обычном старом DFT (это тоже кажется сломанным, так как вы найденный). 4x4 (факторизованный в 2 радикса 2 прохода) будет самым маленьким интересным БПФ. При отладке я часто использовал 8х8 БПФ (radix 4, radix 2).