Hi, I am working on the 3D RFFT but find out the result of rfft using CUDA is a bit weird in Float32 .
I define a function F(k) in k-space as a gaussian function like e^{-(k-k0)^2}e^{-i\phi}, where k0 is some number and phi is a random number array between 0 and 2pi. Here is the implementation
function GetFk(grid;kf = 2,σ²= 1)
kx,ky,kz = grid.kr,grid.l,grid.m;
k⁻¹ = @. √(grid.invKrsq);
k = @. √(grid.Krsq);
Fk = @. √(exp(-(k.-kf)^2/σ²)/2/π)*k⁻¹;
randN = typeof(Fk) <: Array ? Base.rand : CUDA.rand;
eⁱᶿ¹ = exp.(im*randN(T,GPUgrid.nkr,GPUgrid.nl,GPUgrid.nm)*2*π);
return Fk.*eⁱᶿ¹;
end
If I do a rfft on this function, the result of CUDA rfft will overlay a moiré like pattern like below:

Here is the implemention:
using PyPlot,CUDA, FourierFlows
using FFTW
using LinearAlgebra: mul!, ldiv!
T = Float32;
GPUgrid = ThreeDGrid(GPU(),128,2π;T=T);
GFkh = GetFk(GPUgrid;kf = 2,σ²= 1);
GFk = CUDA.zeros(T,GPUgrid.nx,GPUgrid.ny,GPUgrid.nz);
ldiv!(GFk, GPUgrid.rfftplan, deepcopy(GFkh));
CPUgrid = ThreeDGrid(CPU(),128,2π;T=T);
CFkh = Array(GFkh);
CFk = zeros(T,GPUgrid.nx,GPUgrid.ny,GPUgrid.nz);
ldiv!(CFk, CPUgrid.rfftplan, deepcopy(CFkh));
figure(figsize = (16,8))
subplot(121);title("GPU T =$T",size=16)
imshow(Array(GFk[:,:,1]));
subplot(122);title("CPU T =$T",size=16)
imshow(Array(CFk[:,:,1]))
However, if you change T from Float32 to Float64, the result would become normal again:

The problem itself is rare and would happen in this kind of function.
Hi, I am working on the 3D RFFT but find out the result of rfft using CUDA is a bit weird in Float32 .
I define a function
F(k)in k-space as a gaussian function likee^{-(k-k0)^2}e^{-i\phi}, where k0 is some number and phi is a random number array between 0 and 2pi. Here is the implementationIf I do a rfft on this function, the result of CUDA rfft will overlay a moiré like pattern like below:

Here is the implemention:
However, if you change T from Float32 to Float64, the result would become normal again:

The problem itself is rare and would happen in this kind of function.