Прблемы с cuFFT

Статус: Offline
Реєстрація: 05.02.2007
Повідом.: 36996
Прблемы с cuFFT

Доброго времени суток!

Быть может в среди нас есть спецы, что могут помоч мне разрешить существующую делему, которая возникла в результате оптимизации кода.

И есть входящий сигнал, скажем из 4 семплов: 1234, сигнал трансформируеться в матрицу набора окон (скажем размером два и шагом один) - 12, 23, 34, которая сохраняеться и отправляеться на обработку в виде линейного массива с приоритетом столбцов - 122334:
В итоге исполняемый код выглядит где то так:
Код:
cufftPlanMany(&plan, 1, &nFrameSize, NULL, 1, nFrameSize, NULL, 1, nOutSize, CUFFT_R2C, nFrameCount);
cufftExecR2C(plan, pMatrixGPUIn, pGPUOut);
Где
nFrameSize - Размер окна
nFrameStep - Шаг окна.
nOutSize - Размер результирующего окна, nOutSize = nFrameSize / 2 + 1
nFrameCount - Число окон, покрывающих сигнал
pMatrixGPUIn - Линейный массив в памяти GPU, представляющий собой матрицу окон.
pSignalGPUIn - Оригинальный сигнал в памятьи GPU memory.

Однако же легко заметить что данный способ неоптимален, так как требует передачи на GPU лишних данных, а это крайне дорогостоящий процесс. Причем размер избыточных данных тем больше чем меньльче шаг или больше окно.
Родилась идея вместо матрцицы окон передавать оригинальный сигнал, а в качестве параметра, определяющего расстояние между двумя одинаковыми элементами соседних батчей (окон) передавать не размер окна, а шаг:
Код:
cufftPlanMany(&plan, 1, &nFrameSize, NULL, 1, nFrameStep, NULL, 1, nOutSize, CUFFT_R2C, nFrameCount);
cufftExecR2C(plan, pSignalGPUIn, pGPUOut);

Но вот сталось не так как гадалось - результаты вычислений первого и второго сопособа переодически не совпадают: тобишь начиная с какого нибудь элемента несколько элементов имеет значительно разнящиеся между собой реальные части. Причем "какой нибудь" и "несколько" зависят от компа на котором запускаеться код, размера окна и шага, а так же от положения звезд на небосклоне... Тобишь более менее совпадающие места ошибок бывают только при запуске приложения несколько раз подряд на одной и той же машине.

К слову функции из МКЛ: Also fftwf_plan_many_dft_r2c и fftwf_execute - дают одинаковый результат в обоих случаях.

Кто знает в чем может быть проблема и можно ли ее как-то обойти?
 
Назад
Зверху Знизу