Я пытаюсь запустить найденную реализацию галоидного БПФ Вот для бенчмаркинга против FTTW. Я могу запустить реализацию как есть, но я столкнулся с некоторыми проблемами при копании немного глубже. Процедура завершается ошибкой с ошибками для различных значений H и W (высота и ширина случайного входного изображения). Например, я получаю следующую ошибку с H = W = 5:
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, что даже в этот момент делает проверку значений долгое задание FFT также терпит неудачу для значений больше 32, по-видимому, не работает для всех не степеней 2.
Кто-нибудь сталкивался с этим вопросом раньше? Существуют ли другие реализации FFT в галогенидах, которые работают для изображений разных размеров?
Для справки, я запускаю код на RHEL7, используя gcc 4.8.3.
Я думаю, что происходит несколько вопросов. Во-первых, есть ошибка для очень маленьких БПФ, которые используют только один проход. Я думаю, это то, что вы ударили в первом случае.
Вторая проблема заключается в том, что W и H должны быть кратны размеру вектора вашей цели, необязательно, что W и H должны быть степенью 2. Например, W = 48, H = 32, кажется, работает для меня , Существует еще одно осложнение, заключающееся в том, что для реальных БПФ одно измерение внутренне сокращается вдвое (именно так реализуются эффективные реальные БПФ), поэтому, если вы работаете на компьютере AVX, это измерение должно быть кратным 16 (в 2 раза больше ширины вектора 8 поплавков).
Если вы хотите работать с действительно маленькими БПФ, вы можете удалить директивы планирования векторизации, тогда это должно сработать, по крайней мере, для целей обучения.
Тем не менее, я хотел бы отметить, что запуск 5×5 не будет очень интересным, потому что это будет сделано всего за один радикальный 5 проход, то есть просто старый старый DFT (это также, как вы обнаружили, не работает). 4×4 (разделенный на 2 радиуса 2 прохода) будет самым маленьким интересным БПФ. При отладке я часто использовал 8×8 FFT (основание 4, основание 2).
Других решений пока нет …