| 409 | #ifdef WITH_CUDNN |
| 410 | |
| 411 | pair<cudnnConvolutionBwdFilterAlgo_t, size_t> getBackwardFilterAlgorithm( |
| 412 | cudnnHandle_t cudnn, cudnnTensorDescriptor_t x_descriptor, |
| 413 | cudnnTensorDescriptor_t dy_descriptor, |
| 414 | cudnnConvolutionDescriptor_t convolution_descriptor, |
| 415 | cudnnFilterDescriptor_t dw_descriptor) { |
| 416 | // determine algorithm to use |
| 417 | cudnnConvolutionBwdFilterAlgo_t bwd_filt_convolution_algorithm; |
| 418 | // figure out scratch space memory requirements |
| 419 | size_t workspace_bytes = 0; |
| 420 | |
| 421 | auto version = getCudnnPlugin().getVersion(); |
| 422 | if (version.major() >= 8) { |
| 423 | int maxAlgoCount = 0; |
| 424 | CUDNN_CHECK(cuda::cudnnGetConvolutionBackwardFilterAlgorithmMaxCount( |
| 425 | cudnn, &maxAlgoCount)); |
| 426 | |
| 427 | vector<cudnnConvolutionBwdFilterAlgoPerf_t> perfResults(maxAlgoCount); |
| 428 | int returnAlgoCount = 0; |
| 429 | CUDNN_CHECK(cuda::cudnnFindConvolutionBackwardFilterAlgorithm( |
| 430 | cudnn, x_descriptor, dy_descriptor, convolution_descriptor, |
| 431 | dw_descriptor, maxAlgoCount, &returnAlgoCount, perfResults.data())); |
| 432 | |
| 433 | for (int i = 0; i < returnAlgoCount; ++i) { |
| 434 | if (perfResults[i].status == CUDNN_STATUS_SUCCESS) { |
| 435 | bwd_filt_convolution_algorithm = perfResults[i].algo; |
| 436 | workspace_bytes = perfResults[i].memory; |
| 437 | break; |
| 438 | } |
| 439 | } |
| 440 | } else { |
| 441 | CUDNN_CHECK(cuda::cudnnGetConvolutionBackwardFilterAlgorithm( |
| 442 | cudnn, x_descriptor, dy_descriptor, convolution_descriptor, |
| 443 | dw_descriptor, CUDNN_CONVOLUTION_BWD_FILTER_PREFER_FASTEST, 0, |
| 444 | &bwd_filt_convolution_algorithm)); |
| 445 | CUDNN_CHECK(cuda::cudnnGetConvolutionBackwardFilterWorkspaceSize( |
| 446 | cudnn, x_descriptor, dy_descriptor, convolution_descriptor, |
| 447 | dw_descriptor, bwd_filt_convolution_algorithm, &workspace_bytes)); |
| 448 | } |
| 449 | return {bwd_filt_convolution_algorithm, workspace_bytes}; |
| 450 | } |
| 451 | |
| 452 | template<typename T> |
| 453 | Array<T> filter_gradient_cudnn(const Array<T> &incoming_gradient, |
no test coverage detected