| 4072 | } |
| 4073 | |
| 4074 | bool MIOpenSupport::DeriveOutputBatchDescriptor( |
| 4075 | const BatchDescriptor& batch_descriptor, |
| 4076 | const FilterDescriptor& filter_descriptor, |
| 4077 | const dnn::ConvolutionDescriptor& convolution_descriptor, |
| 4078 | dnn::BatchDescriptor* output_batch_descriptor) { |
| 4079 | ScopedTensorDescriptor input_nd{batch_descriptor, miopenFloat}; |
| 4080 | ScopedFilterDescriptor filter{filter_descriptor, batch_descriptor, |
| 4081 | miopenFloat}; |
| 4082 | ScopedConvolutionDescriptor conv{convolution_descriptor, miopenFloat}; |
| 4083 | |
| 4084 | int dn = batch_descriptor.ndims() + 2; |
| 4085 | std::vector<int> dims(dn); // in BDYX |
| 4086 | auto status = wrap::miopenGetConvolutionNdForwardOutputDim( |
| 4087 | conv.handle(), input_nd.handle(), filter.handle(), &dn, dims.data()); |
| 4088 | if (status != miopenStatusSuccess) { |
| 4089 | LOG(ERROR) << "could not get output tensor for convolution: " |
| 4090 | << ToString(status); |
| 4091 | return false; |
| 4092 | } |
| 4093 | |
| 4094 | output_batch_descriptor->set_count(dims[0]) |
| 4095 | .set_feature_map_count(dims[1]) |
| 4096 | .set_layout(batch_descriptor.layout()); |
| 4097 | |
| 4098 | for (int i = 0; i < batch_descriptor.ndims(); i++) { |
| 4099 | output_batch_descriptor->set_spatial_dim(static_cast<dnn::DimIndex>(i), |
| 4100 | dims.rbegin()[i]); |
| 4101 | } |
| 4102 | |
| 4103 | return true; |
| 4104 | } |
| 4105 | |
| 4106 | template <typename T> |
| 4107 | bool MIOpenSupport::DoFusedConvolutionBiasActivationImpl( |