cufft_utils.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021-2024, 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  case CUFFT_INCOMPLETE_PARAMETER_LIST: return "Missing parameters in call.";
47  case CUFFT_INVALID_DEVICE:
48  return "Execution of a plan was on different GPU than plan creation.";
49  case CUFFT_PARSE_ERROR: return "Internal plan database error.";
50  case CUFFT_NO_WORKSPACE: return "No workspace has been provided prior to plan execution.";
51  case CUFFT_NOT_IMPLEMENTED:
52  return "Function does not implement functionality for parameters given.";
53  case CUFFT_NOT_SUPPORTED: return "Operation is not supported for parameters given.";
54  default: return "Unknown error.";
55  }
56 }
57 
64 #define CUFFT_TRY(call) \
65  do { \
66  const cufftResult status = call; \
67  if (status != CUFFT_SUCCESS) { \
68  std::string msg{}; \
69  SET_ERROR_MSG(msg, \
70  "cuFFT error encountered at: ", \
71  "call='%s', Reason=%s", \
72  #call, \
73  raft::getCufftErrStr(status)); \
74  throw raft::cufft_error(msg); \
75  } \
76  } while (0)
77 
78 class CuFFTHandle {
79  public:
80  CuFFTHandle(cudaStream_t stream)
81  {
82  CUFFT_TRY(cufftCreate(&handle));
83  CUFFT_TRY(cufftSetStream(handle, stream));
84  }
85  ~CuFFTHandle() { cufftDestroy(handle); }
86  operator cufftHandle() const { return handle; }
87 
88  private:
89  cufftHandle handle;
90 };
91 
92 } // namespace raft
Definition: cufft_utils.h:78
~CuFFTHandle()
Definition: cufft_utils.h:85
CuFFTHandle(cudaStream_t stream)
Definition: cufft_utils.h:80
#define CUFFT_TRY(call)
Error checking macro for cuFFT functions.
Definition: cufft_utils.h:64
Definition: dbscan.hpp:26
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