16#if (defined(__OFFLOAD_CUDA) || defined(__OFFLOAD_HIP))
17#if defined(__OFFLOAD_CUDA)
19#elif defined(__OFFLOAD_HIP)
20#if (HIP_VERSION < 50600000)
23#include <hipfft/hipfft.h>
27#if defined(__OFFLOAD_CUDA)
28typedef cufftHandle offload_fftHandle;
29typedef cufftType offload_fftType;
30typedef cufftResult offload_fftResult;
31#elif defined(__OFFLOAD_HIP)
32typedef hipfftHandle offload_fftHandle;
33typedef hipfftType offload_fftType;
34typedef hipfftResult offload_fftResult;
37#if defined(__OFFLOAD_CUDA)
38#define OFFLOAD_FFT_SUCCESS CUFFT_SUCCESS
39#define OFFLOAD_FFT_FORWARD CUFFT_FORWARD
40#define OFFLOAD_FFT_INVERSE CUFFT_INVERSE
41#define OFFLOAD_FFT_Z2Z CUFFT_Z2Z
42#elif defined(__OFFLOAD_HIP)
43#define OFFLOAD_FFT_SUCCESS HIPFFT_SUCCESS
44#define OFFLOAD_FFT_FORWARD HIPFFT_FORWARD
45#define OFFLOAD_FFT_INVERSE HIPFFT_BACKWARD
46#define OFFLOAD_FFT_Z2Z HIPFFT_Z2Z
53#define OFFLOAD_FFT_CHECK(status) \
54 if (status != OFFLOAD_FFT_SUCCESS) { \
55 fprintf(stderr, "ERROR: %s %s %d\n", offload_fftGetErrorString(status), \
56 __FILE__, __LINE__); \
63static inline const char *offload_fftGetErrorString(offload_fftResult error) {
64#if defined(__OFFLOAD_CUDA)
67 return "CUFFT_SUCCESS";
68 case CUFFT_INVALID_PLAN:
69 return "CUFFT_INVALID_PLAN";
70 case CUFFT_ALLOC_FAILED:
71 return "CUFFT_ALLOC_FAILED";
72 case CUFFT_INVALID_TYPE:
73 return "CUFFT_INVALID_TYPE";
74 case CUFFT_INVALID_VALUE:
75 return "CUFFT_INVALID_VALUE";
76 case CUFFT_INTERNAL_ERROR:
77 return "CUFFT_INTERNAL_ERROR";
78 case CUFFT_EXEC_FAILED:
79 return "CUFFT_EXEC_FAILED";
80 case CUFFT_SETUP_FAILED:
81 return "CUFFT_SETUP_FAILED";
82 case CUFFT_INVALID_SIZE:
83 return "CUFFT_INVALID_SIZE";
86 case CUFFT_INVALID_DEVICE:
87 return "CUFFT_INVALID_DEVICE";
90 case CUFFT_NO_WORKSPACE:
91 return "CUFFT_NO_WORKSPACE";
92 case CUFFT_NOT_IMPLEMENTED:
93 return "CUFFT_NOT_IMPLEMENTED";
94 case CUFFT_NOT_SUPPORTED:
95 return "CUFFT_NOT_SUPPORTED";
96 case CUFFT_UNALIGNED_DATA:
97 return "CUFFT_UNALIGNED_DATA";
103#elif defined(__OFFLOAD_HIP)
106 return "HIPFFT_SUCCESS";
107 case HIPFFT_INVALID_PLAN:
108 return "HIPFFT_INVALID_PLAN";
109 case HIPFFT_ALLOC_FAILED:
110 return "HIPFFT_ALLOC_FAILED";
111 case HIPFFT_INVALID_TYPE:
112 return "HIPFFT_INVALID_TYPE";
113 case HIPFFT_INVALID_VALUE:
114 return "HIPFFT_INVALID_VALUE";
115 case HIPFFT_INTERNAL_ERROR:
116 return "HIPFFT_INTERNAL_ERROR";
117 case HIPFFT_EXEC_FAILED:
118 return "HIPFFT_EXEC_FAILED";
119 case HIPFFT_SETUP_FAILED:
120 return "HIPFFT_SETUP_FAILED";
121 case HIPFFT_INVALID_SIZE:
122 return "HIPFFT_INVALID_SIZE";
123 case HIPFFT_INCOMPLETE_PARAMETER_LIST:
124 return "HIPFFT_INCOMPLETE_PARAMETER_LIST";
125 case HIPFFT_INVALID_DEVICE:
126 return "HIPFFT_INVALID_DEVICE";
127 case HIPFFT_PARSE_ERROR:
128 return "HIPFFT_PARSE_ERROR";
129 case HIPFFT_NO_WORKSPACE:
130 return "HIPFFT_NO_WORKSPACE";
131 case HIPFFT_NOT_IMPLEMENTED:
132 return "HIPFFT_NOT_IMPLEMENTED";
133 case HIPFFT_NOT_SUPPORTED:
134 return "HIPFFT_NOT_SUPPORTED";
135 case HIPFFT_UNALIGNED_DATA:
136 return "HIPFFT_UNALIGNED_DATA";
147static inline void offload_fftPlan3d(offload_fftHandle *plan,
int nx,
int ny,
148 int nz, offload_fftType type) {
149#if defined(__OFFLOAD_CUDA)
150 OFFLOAD_FFT_CHECK(cufftPlan3d(plan, nx, ny, nz, type));
151#elif defined(__OFFLOAD_HIP)
152 OFFLOAD_FFT_CHECK(hipfftPlan3d(plan, nx, ny, nz, type));
159static inline void offload_fftPlanMany(offload_fftHandle *plan,
int rank,
160 int *n,
int *inembed,
int istride,
161 int idist,
int *onembed,
int ostride,
162 int odist, offload_fftType type,
164#if defined(__OFFLOAD_CUDA)
165 OFFLOAD_FFT_CHECK(cufftPlanMany(plan, rank, n, inembed, istride, idist,
166 onembed, ostride, odist, type, batch));
167#elif defined(__OFFLOAD_HIP)
168 OFFLOAD_FFT_CHECK(hipfftPlanMany(plan, rank, n, inembed, istride, idist,
169 onembed, ostride, odist, type, batch));
176static inline void offload_fftSetStream(offload_fftHandle plan,
177 offloadStream_t stream) {
178#if defined(__OFFLOAD_CUDA)
179 OFFLOAD_FFT_CHECK(cufftSetStream(plan, stream))
180#elif defined(__OFFLOAD_HIP)
181 OFFLOAD_FFT_CHECK(hipfftSetStream(plan, stream))
188static inline void offload_fftDestroy(offload_fftHandle plan) {
189#if defined(__OFFLOAD_CUDA)
190 OFFLOAD_FFT_CHECK(cufftDestroy(plan));
191#elif defined(__OFFLOAD_HIP)
192 OFFLOAD_FFT_CHECK(hipfftDestroy(plan));
199static inline void offload_fftExecZ2Z(offload_fftHandle plan,
200 const double *idata,
double *odata,
202#if defined(__OFFLOAD_CUDA)
203 OFFLOAD_FFT_CHECK(cufftExecZ2Z(plan, (cufftDoubleComplex *)idata,
204 (cufftDoubleComplex *)odata, direction));
205#elif defined(__OFFLOAD_HIP)
206 OFFLOAD_FFT_CHECK(hipfftExecZ2Z(plan, (hipfftDoubleComplex *)idata,
207 (hipfftDoubleComplex *)odata, direction));