Я новичок в программировании CUDA, и мне нужно выполнить операцию сдвига fft над плоским двумерным массивом. Я немного поискал и наткнулся на эту библиотеку, но до сих пор не смог заставить ее работать даже после многочисленных попыток. Вывод:
Как-то неправильно выровнен.
"Поврежден", вероятно, из-за того, что потоки мешают друг другу.
Я решил написать локальную 2D-функцию ffshift на Python, и там она работает отлично. Я не могу понять, что я делаю не так в версии CUDA. В целом я не эксперт по функции fftshift, но тот факт, что эта версия работает на Python, меня сбивает с толку.
def shift(array: NDArray):
N = np.int32(np.sqrt(array.size))
offsetA = (N * N + N) // 2
offsetB = (N * N - N) // 2
for (y, x), _ in np.ndenumerate(array.reshape((N, N))):
idx = y * N + x
if x < N // 2:
if y < N // 2:
array[idx], array[idx + offsetA] = array[idx + offsetA], array[idx]
else:
if y < N // 2:
array[idx], array[idx + offsetB] = array[idx + offsetB], array[idx]
return array.reshape((N, N))
Я новичок в программировании CUDA, и мне нужно выполнить операцию сдвига fft над плоским двумерным массивом. Я немного поискал и наткнулся на эту библиотеку, но до сих пор не смог заставить ее работать даже после многочисленных попыток. Вывод: [list] [*]Как-то неправильно выровнен. [*]"Поврежден", вероятно, из-за того, что потоки мешают друг другу. [/list] Я решил написать локальную 2D-функцию ffshift на Python, и там она работает отлично. Я не могу понять, что я делаю не так в версии CUDA. В целом я не эксперт по функции fftshift, но тот факт, что эта версия работает на Python, меня сбивает с толку. [code]template __global__ void cufftShift_2D_kernel(T* array, int N) { int x = blockIdx.x * blockDim.x + threadIdx.x; int y = blockIdx.y * blockDim.y + threadIdx.y;
int index = y * N + x;
int offsetA = (N * N + N) / 2; int offsetB = (N * N - N) / 2;
T temp;
if (x < N / 2) { if (y < N / 2) { temp = array[index]; array[index] = array[index + offsetA]; array[index + offsetA] = temp; } } else if (y < N / 2) { temp = array[index]; array[index] = array[index + offsetB]; array[index + offsetB] = temp; } }
cufftDestroy(normal); cufftDestroy(inv); return 0; } [/code] Вот эквивалентная версия Python, которая выдает правильный результат: [code]def shift(array: NDArray): N = np.int32(np.sqrt(array.size)) offsetA = (N * N + N) // 2 offsetB = (N * N - N) // 2 for (y, x), _ in np.ndenumerate(array.reshape((N, N))): idx = y * N + x if x < N // 2: if y < N // 2: array[idx], array[idx + offsetA] = array[idx + offsetA], array[idx] else: if y < N // 2: array[idx], array[idx + offsetB] = array[idx + offsetB], array[idx] return array.reshape((N, N)) [/code] И как это выглядит: [img]https://i.sstatic.net/Bu32cwzu.png[/img]
Я новичок в программировании CUDA, и мне нужно выполнить операцию сдвига fft над плоским двумерным массивом. Я немного поискал и наткнулся на эту библиотеку, но до сих пор не смог заставить ее работать даже после многочисленных попыток. Вывод:...
У меня есть nvidia-driver-580 и cuda-tools-13 , установленные на Debian Trixie (оба являются самой новой версией, которую я мог найти): $ a p t l i s t - - i n s t a l l e d | a g n v i d i a f i r m w a r e - n v i d i a - g s p / u n k n o w n , n...
Я пытаюсь показать в Python эквивалентность умножения двух сигналов во временной области и их свертки в частотной области.
Благодаря Baddioes в этом посте, это было показано, что такую эквивалентность можно показать с помощью функции fftshift, но...
Я пытаюсь показать в Python эквивалентность умножения двух сигналов во временной области и их свертки в частотной области.
Благодаря Baddioes в этом посте, это было показано, что такую эквивалентность можно показать с помощью функции fftshift, но...