NOTE(keveman): Temporary data layout transformation until MIOpen supports kBatchYXDepth for backward pass. This function allocates temporary memory, lays out the source data into the temporary but in the kBatchDepthXY layout, and returns the temporary memory. The caller is responsible for deallocating the temporary. Since the allocation is done using Stream's AllocateTemporaryMemory, a later Block
| 2824 | // transform_scratch is populated with a legitimate temporary allocation iff |
| 2825 | // the original output data needs to be transformed. |
| 2826 | static DeviceMemoryBase MaybeTransformLayout( |
| 2827 | Stream* stream, miopenHandle_t handle_, |
| 2828 | int miopen_type, // Actually miopenDataType_t. |
| 2829 | BatchDescriptor* output_descriptor, DeviceMemoryBase backward_output_data, |
| 2830 | std::unique_ptr<TemporaryDeviceMemory<uint8>>* transform_scratch) { |
| 2831 | if (output_descriptor->layout() == dnn::DataLayout::kBatchDepthYX) { |
| 2832 | return backward_output_data; |
| 2833 | } |
| 2834 | CHECK(output_descriptor->layout() == dnn::DataLayout::kBatchYXDepth); |
| 2835 | *transform_scratch = |
| 2836 | stream->AllocateTemporaryArray<uint8>(backward_output_data.size()) |
| 2837 | .ConsumeValueOrDie(); |
| 2838 | BatchDescriptor transformed_output_descriptor; |
| 2839 | transformed_output_descriptor.CloneFrom(*output_descriptor); |
| 2840 | transformed_output_descriptor.set_layout(dnn::DataLayout::kBatchDepthYX); |
| 2841 | ScopedTensorDescriptor orig_out_back_nd{ |
| 2842 | *output_descriptor, static_cast<miopenDataType_t>(miopen_type)}; |
| 2843 | ScopedTensorDescriptor transformed_out_back_nd{ |
| 2844 | transformed_output_descriptor, |
| 2845 | static_cast<miopenDataType_t>(miopen_type)}; |
| 2846 | |
| 2847 | float alpha1 = 1.0f; |
| 2848 | float alpha2 = 0.0f; |
| 2849 | float beta = 0.0f; |
| 2850 | auto status = wrap::miopenOpTensor( |
| 2851 | handle_, miopenTensorOpAdd, &alpha1, orig_out_back_nd.handle(), |
| 2852 | backward_output_data.opaque(), &alpha2, orig_out_back_nd.handle(), |
| 2853 | backward_output_data.opaque(), &beta, transformed_out_back_nd.handle(), |
| 2854 | (*transform_scratch)->mutable_device_memory()->opaque()); |
| 2855 | |
| 2856 | if (status != miopenStatusSuccess) { |
| 2857 | LOG(FATAL) << "Failed to transform the data layout."; |
| 2858 | } |
| 2859 | output_descriptor->set_layout(dnn::DataLayout::kBatchDepthYX); |
| 2860 | return (*transform_scratch)->device_memory(); |
| 2861 | } |
| 2862 | |
| 2863 | port::Status MIOpenSupport::DoConvolve( |
| 2864 | dnn::ConvolutionKind kind, dnn::DataType element_type, |
no test coverage detected