Skip to content

Commit a101bc1

Browse files
authored
[Iluvatar_gpu] Support CUDAExtension Compilation (#2275)
* add dynload header in whl * remove dynload header * fix cusparse
1 parent 8a67277 commit a101bc1

6 files changed

Lines changed: 472 additions & 107 deletions

File tree

backends/iluvatar_gpu/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,6 +1015,7 @@ target_link_libraries(
10151015
)
10161016

10171017
include_directories(BEFORE ${PADDLE_SOURCE_DIR})
1018+
include_directories(BEFORE ${CMAKE_SOURCE_DIR}/headers)
10181019

10191020
target_compile_definitions(
10201021
${TARGET_NAME}
@@ -1035,8 +1036,12 @@ add_custom_command(
10351036
POST_BUILD
10361037
COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_CURRENT_BINARY_DIR}/python/
10371038
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/python/
1039+
COMMAND ${CMAKE_COMMAND} -E make_directory
1040+
${CMAKE_CURRENT_BINARY_DIR}/python/include/
10381041
COMMAND ${CMAKE_COMMAND} -E make_directory
10391042
${CMAKE_CURRENT_BINARY_DIR}/python/paddle_custom_device/
1043+
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/headers
1044+
${CMAKE_CURRENT_BINARY_DIR}/python/include/
10401045
COMMAND
10411046
${CMAKE_COMMAND} -E copy_if_different
10421047
${CMAKE_CURRENT_BINARY_DIR}/lib${TARGET_NAME}.so
Lines changed: 242 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,242 @@
1+
/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved.
2+
3+
Licensed under the Apache License, Version 2.0 (the "License");
4+
you may not use this file except in compliance with the License.
5+
You may obtain a copy of the License at
6+
7+
http://www.apache.org/licenses/LICENSE-2.0
8+
9+
Unless required by applicable law or agreed to in writing, software
10+
distributed under the License is distributed on an "AS IS" BASIS,
11+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
See the License for the specific language governing permissions and
13+
limitations under the License. */
14+
15+
#pragma once
16+
#ifdef PADDLE_WITH_CUDA
17+
#include <cudnn.h>
18+
19+
#include <mutex> // NOLINT
20+
21+
#include "paddle/phi/backends/dynload/dynamic_loader.h"
22+
#include "paddle/phi/common/port.h"
23+
24+
namespace phi {
25+
namespace dynload {
26+
27+
extern std::once_flag cudnn_dso_flag;
28+
extern void* cudnn_dso_handle;
29+
extern bool HasCUDNN();
30+
31+
extern void EnforceCUDNNLoaded(const char* fn_name);
32+
#define DECLARE_DYNAMIC_LOAD_CUDNN_WRAP(__name) \
33+
struct DynLoad__##__name { \
34+
template <typename... Args> \
35+
auto operator()(Args... args) -> DECLARE_TYPE(__name, args...) { \
36+
using cudnn_func = decltype(&::__name); \
37+
std::call_once(cudnn_dso_flag, []() { \
38+
cudnn_dso_handle = phi::dynload::GetCUDNNDsoHandle(); \
39+
}); \
40+
EnforceCUDNNLoaded(#__name); \
41+
static void* p_##__name = dlsym(cudnn_dso_handle, #__name); \
42+
return reinterpret_cast<cudnn_func>(p_##__name)(args...); \
43+
} \
44+
}; \
45+
extern struct DynLoad__##__name __name
46+
47+
/**
48+
* include all needed cudnn functions in HPPL
49+
* different cudnn version has different interfaces
50+
**/
51+
#define CUDNN_DNN_ROUTINE_EACH(__macro) \
52+
__macro(cudnnSetCallback); \
53+
__macro(cudnnSetTensor4dDescriptor); \
54+
__macro(cudnnSetTensor4dDescriptorEx); \
55+
__macro(cudnnSetTensorNdDescriptor); \
56+
__macro(cudnnGetTensorNdDescriptor); \
57+
__macro(cudnnGetConvolutionNdForwardOutputDim); \
58+
__macro(cudnnCreateTensorDescriptor); \
59+
__macro(cudnnDestroyTensorDescriptor); \
60+
__macro(cudnnCreateFilterDescriptor); \
61+
__macro(cudnnSetFilter4dDescriptor); \
62+
__macro(cudnnSetFilterNdDescriptor); \
63+
__macro(cudnnGetFilterNdDescriptor); \
64+
__macro(cudnnSetPooling2dDescriptor); \
65+
__macro(cudnnSetPoolingNdDescriptor); \
66+
__macro(cudnnGetPoolingNdDescriptor); \
67+
__macro(cudnnDestroyFilterDescriptor); \
68+
__macro(cudnnCreateConvolutionDescriptor); \
69+
__macro(cudnnCreatePoolingDescriptor); \
70+
__macro(cudnnDestroyPoolingDescriptor); \
71+
__macro(cudnnSetConvolution2dDescriptor); \
72+
__macro(cudnnDestroyConvolutionDescriptor); \
73+
__macro(cudnnSetConvolutionNdDescriptor); \
74+
__macro(cudnnGetConvolutionNdDescriptor); \
75+
__macro(cudnnDeriveBNTensorDescriptor); \
76+
__macro(cudnnCreateSpatialTransformerDescriptor); \
77+
__macro(cudnnSetSpatialTransformerNdDescriptor); \
78+
__macro(cudnnDestroySpatialTransformerDescriptor); \
79+
__macro(cudnnSpatialTfGridGeneratorForward); \
80+
__macro(cudnnSpatialTfGridGeneratorBackward); \
81+
__macro(cudnnSpatialTfSamplerForward); \
82+
__macro(cudnnSpatialTfSamplerBackward); \
83+
__macro(cudnnCreate); \
84+
__macro(cudnnDestroy); \
85+
__macro(cudnnSetStream); \
86+
__macro(cudnnActivationForward); \
87+
__macro(cudnnActivationBackward); \
88+
__macro(cudnnConvolutionForward); \
89+
__macro(cudnnConvolutionBackwardBias); \
90+
__macro(cudnnGetConvolutionForwardWorkspaceSize); \
91+
__macro(cudnnTransformTensor); \
92+
__macro(cudnnPoolingForward); \
93+
__macro(cudnnPoolingBackward); \
94+
__macro(cudnnSoftmaxBackward); \
95+
__macro(cudnnSoftmaxForward); \
96+
__macro(cudnnGetVersion); \
97+
__macro(cudnnFindConvolutionForwardAlgorithmEx); \
98+
__macro(cudnnFindConvolutionBackwardFilterAlgorithmEx); \
99+
__macro(cudnnFindConvolutionBackwardFilterAlgorithm); \
100+
__macro(cudnnFindConvolutionBackwardDataAlgorithmEx); \
101+
__macro(cudnnGetErrorString); \
102+
__macro(cudnnCreateDropoutDescriptor); \
103+
__macro(cudnnDropoutGetStatesSize); \
104+
__macro(cudnnSetDropoutDescriptor); \
105+
__macro(cudnnRestoreDropoutDescriptor); \
106+
__macro(cudnnCreateRNNDescriptor); \
107+
__macro(cudnnDestroyDropoutDescriptor); \
108+
__macro(cudnnDestroyRNNDescriptor); \
109+
__macro(cudnnSetTensorNdDescriptorEx); \
110+
__macro(cudnnAddTensor); \
111+
__macro(cudnnConvolutionBackwardData); \
112+
__macro(cudnnConvolutionBackwardFilter); \
113+
__macro(cudnnGetConvolutionBackwardFilterWorkspaceSize); \
114+
__macro(cudnnGetConvolutionBackwardDataWorkspaceSize); \
115+
__macro(cudnnBatchNormalizationForwardTraining); \
116+
__macro(cudnnBatchNormalizationForwardInference); \
117+
__macro(cudnnBatchNormalizationBackward); \
118+
__macro(cudnnCreateActivationDescriptor); \
119+
__macro(cudnnSetActivationDescriptor); \
120+
__macro(cudnnGetActivationDescriptor); \
121+
__macro(cudnnDestroyActivationDescriptor);
122+
CUDNN_DNN_ROUTINE_EACH(DECLARE_DYNAMIC_LOAD_CUDNN_WRAP)
123+
124+
#if CUDNN_VERSION >= 7000 && CUDNN_VERSION < 8000
125+
#define CUDNN_DNN_ROUTINE_EACH_AFTER_R7_LESS_R8(__macro) \
126+
__macro(cudnnGetConvolutionBackwardFilterAlgorithm); \
127+
__macro(cudnnGetConvolutionForwardAlgorithm); \
128+
__macro(cudnnGetConvolutionBackwardDataAlgorithm); \
129+
__macro(cudnnSetRNNDescriptor);
130+
CUDNN_DNN_ROUTINE_EACH_AFTER_R7_LESS_R8(DECLARE_DYNAMIC_LOAD_CUDNN_WRAP)
131+
#endif
132+
133+
#if CUDNN_VERSION >= 7001
134+
#define CUDNN_DNN_ROUTINE_EACH_R7(__macro) \
135+
__macro(cudnnSetConvolutionGroupCount); \
136+
__macro(cudnnSetConvolutionMathType); \
137+
__macro(cudnnConvolutionBiasActivationForward); \
138+
__macro(cudnnCreateCTCLossDescriptor); \
139+
__macro(cudnnDestroyCTCLossDescriptor); \
140+
__macro(cudnnGetCTCLossDescriptor); \
141+
__macro(cudnnSetCTCLossDescriptor); \
142+
__macro(cudnnGetCTCLossWorkspaceSize); \
143+
__macro(cudnnCTCLoss); \
144+
__macro(cudnnGetConvolutionBackwardDataAlgorithm_v7); \
145+
__macro(cudnnGetConvolutionBackwardFilterAlgorithm_v7); \
146+
__macro(cudnnGetConvolutionForwardAlgorithm_v7); \
147+
__macro(cudnnGetConvolutionBackwardFilterAlgorithmMaxCount);
148+
CUDNN_DNN_ROUTINE_EACH_R7(DECLARE_DYNAMIC_LOAD_CUDNN_WRAP)
149+
#endif
150+
151+
#if CUDNN_VERSION >= 7201
152+
#define CUDNN_DNN_ROUTINE_EACH_AFTER_TWO_R7(__macro) \
153+
__macro(cudnnCreateRNNDataDescriptor); \
154+
__macro(cudnnDestroyRNNDataDescriptor); \
155+
__macro(cudnnSetRNNDataDescriptor);
156+
CUDNN_DNN_ROUTINE_EACH_AFTER_TWO_R7(DECLARE_DYNAMIC_LOAD_CUDNN_WRAP)
157+
#endif
158+
159+
#if CUDNN_VERSION >= 7401
160+
#define CUDNN_DNN_ROUTINE_EACH_AFTER_R7(__macro) \
161+
__macro(cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize); \
162+
__macro(cudnnBatchNormalizationForwardTrainingEx); \
163+
__macro(cudnnGetBatchNormalizationBackwardExWorkspaceSize); \
164+
__macro(cudnnBatchNormalizationBackwardEx); \
165+
__macro(cudnnGetBatchNormalizationTrainingExReserveSpaceSize);
166+
CUDNN_DNN_ROUTINE_EACH_AFTER_R7(DECLARE_DYNAMIC_LOAD_CUDNN_WRAP)
167+
#endif
168+
169+
#if CUDNN_VERSION >= 8000
170+
#define CUDNN_DNN_ROUTINE_EACH_R8(__macro) \
171+
__macro(cudnnSetRNNDescriptor_v8); \
172+
__macro(cudnnCreateFusedOpsPlan); \
173+
__macro(cudnnCreateFusedOpsConstParamPack); \
174+
__macro(cudnnCreateFusedOpsVariantParamPack); \
175+
__macro(cudnnDestroyFusedOpsPlan); \
176+
__macro(cudnnDestroyFusedOpsConstParamPack); \
177+
__macro(cudnnDestroyFusedOpsVariantParamPack); \
178+
__macro(cudnnFusedOpsExecute); \
179+
__macro(cudnnSetFusedOpsConstParamPackAttribute); \
180+
__macro(cudnnSetFusedOpsVariantParamPackAttribute); \
181+
__macro(cudnnMakeFusedOpsPlan);
182+
CUDNN_DNN_ROUTINE_EACH_R8(DECLARE_DYNAMIC_LOAD_CUDNN_WRAP)
183+
#endif
184+
185+
#ifdef PADDLE_WITH_CUDNN_FRONTEND
186+
#define CUDNN_DNN_ROUTINE_EACH_FRONTEND(__macro) \
187+
__macro(cudnnBackendCreateDescriptor); \
188+
__macro(cudnnBackendDestroyDescriptor); \
189+
__macro(cudnnBackendExecute); \
190+
__macro(cudnnBackendFinalize); \
191+
__macro(cudnnBackendGetAttribute); \
192+
__macro(cudnnBackendSetAttribute); \
193+
__macro(cudnnGetStream); \
194+
__macro(cudnnReorderFilterAndBias);
195+
CUDNN_DNN_ROUTINE_EACH_FRONTEND(DECLARE_DYNAMIC_LOAD_CUDNN_WRAP)
196+
#endif
197+
198+
#if CUDNN_VERSION < 90000
199+
#define CUDNN_DNN_ROUTINE_EACH_REMOVED_IN_E9(__macro) \
200+
__macro(cudnnGetRNNParamsSize); \
201+
__macro(cudnnGetRNNWorkspaceSize); \
202+
__macro(cudnnGetRNNTrainingReserveSize); \
203+
__macro(cudnnSetRNNDescriptor_v6); \
204+
__macro(cudnnRNNForwardInference); \
205+
__macro(cudnnRNNForwardTraining); \
206+
__macro(cudnnRNNBackwardData); \
207+
__macro(cudnnRNNBackwardWeights);
208+
CUDNN_DNN_ROUTINE_EACH_REMOVED_IN_E9(DECLARE_DYNAMIC_LOAD_CUDNN_WRAP)
209+
210+
#define CUDNN_DNN_ROUTINE_EACH_AFTER_TWO_R7_REMOVED_IN_E9(__macro) \
211+
__macro(cudnnSetRNNPaddingMode); \
212+
__macro(cudnnRNNForwardInferenceEx); \
213+
__macro(cudnnRNNForwardTrainingEx); \
214+
__macro(cudnnRNNBackwardDataEx); \
215+
__macro(cudnnRNNBackwardWeightsEx);
216+
CUDNN_DNN_ROUTINE_EACH_AFTER_TWO_R7_REMOVED_IN_E9(
217+
DECLARE_DYNAMIC_LOAD_CUDNN_WRAP)
218+
#endif
219+
220+
#if CUDNN_VERSION >= 90000
221+
#define CUDNN_DNN_ROUTINE_EACH_R9(__macro) \
222+
__macro(cudnnGetLastErrorString); \
223+
__macro(cudnnGetRNNWeightSpaceSize); \
224+
__macro(cudnnGetRNNTempSpaceSizes); \
225+
__macro(cudnnRNNForward); \
226+
__macro(cudnnRNNBackwardData_v8); \
227+
__macro(cudnnRNNBackwardWeights_v8);
228+
CUDNN_DNN_ROUTINE_EACH_R9(DECLARE_DYNAMIC_LOAD_CUDNN_WRAP)
229+
#endif
230+
231+
#define CUDNN_DNN_ROUTINE_EACH_ATTN(__macro) \
232+
__macro(cudnnFlashAttnForward); \
233+
__macro(cudnnCreateFlashAttnDescriptor); \
234+
__macro(cudnnGetFlashAttnBuffers); \
235+
__macro(cudnnDestroyFlashAttnDescriptor); \
236+
__macro(cudnnFlashAttnBackward); \
237+
__macro(cudnnSetTensorNdDescriptor_lowerbound_2);
238+
CUDNN_DNN_ROUTINE_EACH_ATTN(DECLARE_DYNAMIC_LOAD_CUDNN_WRAP)
239+
} // namespace dynload
240+
} // namespace phi
241+
242+
#endif

0 commit comments

Comments
 (0)