> -----Original Message-----
> From: EXT Ivan Khoronzhuk [mailto:ivan.khoronz...@linaro.org]
> Sent: Friday, January 15, 2016 5:07 PM
> To: lng-odp@lists.linaro.org
> Cc: Savolainen, Petri (Nokia - FI/Espoo); Ivan Khoronzhuk
> Subject: [lng-odp] [PATCH v5] validation: system: add validation tests for
> odp_cpu_cycles_* calls
> 
> https://bugs.linaro.org/show_bug.cgi?id=1906
> 
> Signed-off-by: Ivan Khoronzhuk <ivan.khoronz...@linaro.org>
> ---
>  test/validation/system/system.c | 130
> ++++++++++++++++++++++++++++++++++++++++
>  test/validation/system/system.h |   4 ++
>  2 files changed, 134 insertions(+)
> 
> diff --git a/test/validation/system/system.c
> b/test/validation/system/system.c
> index 7dc2cc0..f59c570 100644
> --- a/test/validation/system/system.c
> +++ b/test/validation/system/system.c
> @@ -10,6 +10,9 @@
>  #include "test_debug.h"
>  #include "system.h"
> 
> +#define DIFF_TRY_NUM                 160
> +#define RES_TRY_NUM                  10
> +
>  void system_test_odp_version_numbers(void)
>  {
>       int char_ok = 0;
> @@ -40,6 +43,129 @@ void system_test_odp_cpu_count(void)
>       CU_ASSERT(0 < cpus);
>  }
> 
> +void system_test_odp_cpu_cycles(void)
> +{
> +     uint64_t c2, c1;
> +
> +     c1 = odp_cpu_cycles();
> +     odp_time_wait_ns(100);
> +     c2 = odp_cpu_cycles();
> +
> +     CU_ASSERT(c2 != c1);
> +}
> +
> +void system_test_odp_cpu_cycles_max(void)
> +{
> +     uint64_t c2, c1;
> +     uint64_t max1, max2;
> +
> +     max1 = odp_cpu_cycles_max();
> +     odp_time_wait_ns(100);
> +     max2 = odp_cpu_cycles_max();
> +
> +     CU_ASSERT(max1 >= UINT32_MAX / 2);
> +     CU_ASSERT(max1 == max2);
> +
> +     c1 = odp_cpu_cycles();
> +     odp_time_wait_ns(1000);
> +     c2 = odp_cpu_cycles();
> +
> +     CU_ASSERT(c1 <= max1 && c2 <= max1);
> +}
> +
> +void system_test_odp_cpu_cycles_diff(void)
> +{
> +     int i;
> +     uint64_t c2, c1, c3;
> +     uint64_t tmp, diff;
> +
> +     c2 = 100;
> +     c1 = 39;
> +
> +     diff = odp_cpu_cycles_diff(c2, c2);
> +     CU_ASSERT(diff == 0);
> +
> +     tmp = c2 - c1;
> +     diff = odp_cpu_cycles_diff(c2, c1);
> +     CU_ASSERT(diff == tmp);
> +
> +     tmp = c1 + (odp_cpu_cycles_max() - c2) + 1;


As noted before, '+1' in the equation holds only if resolution is 1. The 
equation should be:

diff = c2 + (odp_cpu_cycles_max() - c1) + odp_cpu_cycles_resolution();

It would be also more readable if c1 is always the first sample and c2 the 
second (c1 = 100, c2 = 39 in this test case).


Max: 90
Res: 10
Valid values: 0, 10, 20, ..., 80, 90

c1 = 90
<wrap> 
c2 = 0

       c2   max  c1   res
diff = 0 + (90 - 90) + 10 = 10


-Petri


> +     diff = odp_cpu_cycles_diff(c1, c2);
> +     CU_ASSERT(diff == tmp);
> +
> +     c3 = odp_cpu_cycles();
> +
> +     /* must handle one wrap */
> +     for (i = 0; i < DIFF_TRY_NUM; i++) {
> +             c1 = odp_cpu_cycles();
> +             odp_time_wait_ns(100 * ODP_TIME_MSEC_IN_NS + i);
> +             c2 = odp_cpu_cycles();
> +
> +             CU_ASSERT(c2 != c1);
> +
> +             if (c2 > c1)
> +                     tmp = c2 - c1;
> +             else
> +                     tmp = c2 + (odp_cpu_cycles_max() - c1) + 1;
> +
> +             diff = odp_cpu_cycles_diff(c2, c1);
> +             CU_ASSERT(diff == tmp);
> +
> +             /* wrap is detected and verified */
> +             if (c2 < c1)
> +                     break;
> +     }
> +
> +     /* wrap was detected, no need to continue */
> +     if (i < DIFF_TRY_NUM)
> +             return;
> +
> +     CU_ASSERT(odp_cpu_cycles_max() > UINT32_MAX);
> +     CU_ASSERT((odp_cpu_cycles_max() - c3) > UINT32_MAX);
> +
> +     printf("wrap was not detected...");
> +}
> +
> +void system_test_odp_cpu_cycles_resolution(void)
> +{
> +     int i;
> +     uint64_t rest;
> +     uint64_t res, diff;
> +     uint64_t c2, c1, max;
> +
> +     max = odp_cpu_cycles_max();
> +
> +     res = odp_cpu_cycles_resolution();
> +     CU_ASSERT(res != 0);
> +     CU_ASSERT(res < max / 1024);
> +
> +     /* check resolution for wrap */
> +     c1 = max - 2 * res;
> +     do
> +             c2 = odp_cpu_cycles();
> +     while (c1 < c2);
> +
> +     diff = odp_cpu_cycles_diff(c1, c2);
> +     rest = diff % res;
> +     CU_ASSERT(rest == 0);
> +
> +     for (i = 0; i < RES_TRY_NUM; i++) {
> +             c1 = odp_cpu_cycles();
> +             odp_time_wait_ns(100 * ODP_TIME_MSEC_IN_NS + i);
> +             c2 = odp_cpu_cycles();
> +
> +             diff = odp_cpu_cycles_diff(c2, c1);
> +             rest = diff % res;
> +             CU_ASSERT(rest == 0);
> +
> +             rest = c1 % res;
> +             CU_ASSERT(rest == 0);
> +
> +             rest = c2 % res;
> +             CU_ASSERT(rest == 0);
> +     }
> +}
> +
>  void system_test_odp_sys_cache_line_size(void)
>  {
>       uint64_t cache_size;
> @@ -91,6 +217,10 @@ odp_testinfo_t system_suite[] = {
>       ODP_TEST_INFO(system_test_odp_sys_page_size),
>       ODP_TEST_INFO(system_test_odp_sys_huge_page_size),
>       ODP_TEST_INFO(system_test_odp_sys_cpu_hz),
> +     ODP_TEST_INFO(system_test_odp_cpu_cycles),
> +     ODP_TEST_INFO(system_test_odp_cpu_cycles_max),
> +     ODP_TEST_INFO(system_test_odp_cpu_cycles_diff),
> +     ODP_TEST_INFO(system_test_odp_cpu_cycles_resolution),
>       ODP_TEST_INFO_NULL,
>  };
> 
> diff --git a/test/validation/system/system.h
> b/test/validation/system/system.h
> index 869aaff..0c263f2 100644
> --- a/test/validation/system/system.h
> +++ b/test/validation/system/system.h
> @@ -17,6 +17,10 @@ void system_test_odp_sys_cpu_model_str(void);
>  void system_test_odp_sys_page_size(void);
>  void system_test_odp_sys_huge_page_size(void);
>  void system_test_odp_sys_cpu_hz(void);
> +void system_test_odp_cpu_cycles_max(void);
> +void system_test_odp_cpu_cycles(void);
> +void system_test_odp_cpu_cycles_diff(void);
> +void system_test_odp_cpu_cycles_resolution(void);
> 
>  /* test arrays: */
>  extern odp_testinfo_t system_suite[];
> --
> 1.9.1

_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to