cufft_utils.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021-2025, NVIDIA CORPORATION.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <raft/core/error.hpp>
20 
21 #include <cufft.h>
22 
23 // TODO move to raft https://github.com/rapidsai/raft/issues/91
24 namespace raft {
25 
29 struct cufft_error : public raft::exception {
30  explicit cufft_error(char const* const message) : raft::exception(message) {}
31  explicit cufft_error(std::string const& message) : raft::exception(message) {}
32 };
33 
34 const char* getCufftErrStr(cufftResult status)
35 {
36  // https://docs.nvidia.com/cuda/cufft/index.html#cufftresult
37  switch (status) {
38  case CUFFT_SUCCESS: return "The cuFFT operation was successful.";
39  case CUFFT_INVALID_PLAN: return "cuFFT was passed an invalid plan handle.";
40  case CUFFT_ALLOC_FAILED: return "cuFFT failed to allocate GPU or CPU memory.";
41  case CUFFT_INVALID_VALUE: return "User specified an invalid pointer or parameter.";
42  case CUFFT_INTERNAL_ERROR: return "Driver or internal cuFFT library error.";
43  case CUFFT_EXEC_FAILED: return "Failed to execute an FFT on the GPU.";
44  case CUFFT_SETUP_FAILED: return "The cuFFT library failed to initialize.";
45  case CUFFT_INVALID_SIZE: return "User specified an invalid transform size.";
46 #if defined(CUDART_VERSION) && CUDART_VERSION < 13000
47  case CUFFT_INCOMPLETE_PARAMETER_LIST: return "Missing parameters in call.";
48 #endif
49  case CUFFT_INVALID_DEVICE:
50  return "Execution of a plan was on different GPU than plan creation.";
51 #if defined(CUDART_VERSION) && CUDART_VERSION < 13000
52  case CUFFT_PARSE_ERROR: return "Internal plan database error.";
53 #endif
54  case CUFFT_NO_WORKSPACE: return "No workspace has been provided prior to plan execution.";
55  case CUFFT_NOT_IMPLEMENTED:
56  return "Function does not implement functionality for parameters given.";
57  case CUFFT_NOT_SUPPORTED: return "Operation is not supported for parameters given.";
58  default: return "Unknown error.";
59  }
60 }
61 
68 #define CUFFT_TRY(call) \
69  do { \
70  const cufftResult status = call; \
71  if (status != CUFFT_SUCCESS) { \
72  std::string msg{}; \
73  SET_ERROR_MSG(msg, \
74  "cuFFT error encountered at: ", \
75  "call='%s', Reason=%s", \
76  #call, \
77  raft::getCufftErrStr(status)); \
78  throw raft::cufft_error(msg); \
79  } \
80  } while (0)
81 
82 class CuFFTHandle {
83  public:
84  CuFFTHandle(cudaStream_t stream)
85  {
86  CUFFT_TRY(cufftCreate(&handle));
87  CUFFT_TRY(cufftSetStream(handle, stream));
88  }
89  ~CuFFTHandle() { cufftDestroy(handle); }
90  operator cufftHandle() const { return handle; }
91 
92  private:
93  cufftHandle handle;
94 };
95 
96 } // namespace raft
Definition: cufft_utils.h:82
~CuFFTHandle()
Definition: cufft_utils.h:89
CuFFTHandle(cudaStream_t stream)
Definition: cufft_utils.h:84
#define CUFFT_TRY(call)
Error checking macro for cuFFT functions.
Definition: cufft_utils.h:68
Definition: dbscan.hpp:25
const char * getCufftErrStr(cufftResult status)
Definition: cufft_utils.h:34
Exception thrown when a cuFFT error is encountered.
Definition: cufft_utils.h:29
cufft_error(std::string const &message)
Definition: cufft_utils.h:31
cufft_error(char const *const message)
Definition: cufft_utils.h:30