aboutsummaryrefslogtreecommitdiff
path: root/tests/validation/reference/Convolution.cpp
diff options
context:
space:
mode:
authorGeorgios Pinitas <georgios.pinitas@arm.com>2018-02-07 16:05:47 +0000
committerAnthony Barbier <anthony.barbier@arm.com>2018-11-02 16:46:07 +0000
commite9146ed3b4ad8501cb17dfe5953ef0259f106c2e (patch)
tree905f3ea47ff8baf5e67b4970f118f58f7ce48e33 /tests/validation/reference/Convolution.cpp
parent6e464c37b5335e362ac3f988cc4b0beed5205ff4 (diff)
downloadComputeLibrary-e9146ed3b4ad8501cb17dfe5953ef0259f106c2e.tar.gz
COMPMID-879: Investigate CL mismatches in Convolution S16
Changes and simplifies the validation to divide the scale in integer format instead of double. Change-Id: Ib9156e9515e4e542391eeda11548f3d15613a0af Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/119256 Tested-by: Jenkins <bsgcomp@arm.com> Reviewed-by: Gian Marco Iodice <gianmarco.iodice@arm.com>
Diffstat (limited to 'tests/validation/reference/Convolution.cpp')
-rw-r--r--tests/validation/reference/Convolution.cpp48
1 files changed, 9 insertions, 39 deletions
diff --git a/tests/validation/reference/Convolution.cpp b/tests/validation/reference/Convolution.cpp
index 5d0cf1ea93..e3d4b4ac1e 100644
--- a/tests/validation/reference/Convolution.cpp
+++ b/tests/validation/reference/Convolution.cpp
@@ -39,49 +39,19 @@ SimpleTensor<T> convolution(const SimpleTensor<uint8_t> &src, DataType output_da
const unsigned int width,
const unsigned int height)
{
- ARM_COMPUTE_ERROR_ON(0 == scale);
+ ARM_COMPUTE_ERROR_ON(scale == 0);
+ ARM_COMPUTE_ERROR_ON(scale >= std::numeric_limits<int32_t>::max());
- SimpleTensor<T> dst(src.shape(), output_data_type);
+ SimpleTensor<T> dst(src.shape(), output_data_type);
+ SimpleTensor<int32_t> sum(src.shape(), output_data_type);
- switch(output_data_type)
+ for(int element_idx = 0; element_idx < src.num_elements(); ++element_idx)
{
- case DataType::S16:
- {
- SimpleTensor<int16_t> sum(src.shape(), output_data_type);
- for(int element_idx = 0; element_idx < src.num_elements(); ++element_idx)
- {
- const Coordinates id = index2coord(src.shape(), element_idx);
- apply_2d_spatial_filter(id, src, sum, TensorShape(width, height), conv, 1 / static_cast<double>(scale), border_mode, constant_border_value);
- dst[element_idx] = tensor_elem_at<int16_t>(sum, id, border_mode, constant_border_value);
- }
- }
- break;
- case DataType::U8:
- {
- SimpleTensor<int32_t> sum(src.shape(), output_data_type);
- for(int element_idx = 0; element_idx < src.num_elements(); ++element_idx)
- {
- const Coordinates id = index2coord(src.shape(), element_idx);
- apply_2d_spatial_filter(id, src, sum, TensorShape(width, height), conv, 1, border_mode, constant_border_value);
- if(tensor_elem_at<int32_t>(sum, id, border_mode, constant_border_value) < 0)
- {
- dst[element_idx] = 0;
- }
- else if((tensor_elem_at<int32_t>(sum, id, border_mode, constant_border_value) / scale) > 255)
- {
- dst[element_idx] = 255;
- }
- else
- {
- dst[element_idx] = tensor_elem_at<int32_t>(sum, id, border_mode, constant_border_value) / scale;
- }
- }
- }
- break;
- default:
- ARM_COMPUTE_ERROR("Not supported DataType");
- break;
+ const Coordinates id = index2coord(src.shape(), element_idx);
+ apply_2d_spatial_filter(id, src, sum, TensorShape(width, height), conv, 1, border_mode, constant_border_value);
+ dst[element_idx] = saturate_cast<T>(tensor_elem_at<int32_t>(sum, id, border_mode, constant_border_value) / static_cast<int>(scale));
}
+
return dst;
}