This is from 22th Oct, RE: [lng-odp] [API-NEXT PATCH] api: clib: added standard 
c library api. About +20% performance compared to standard C lib 
implementation. This is not for wrapping it but for optimizing it.

-Petri




Here's some cycle count measurements from x86 with DPDK. Compiled with -O2 
-mavx2, so that GCC knows about AVX2 and memcpy could use the same vector 
instructions that DPDK uses (== best case results for memcpy). Code warms up 
caches before measuring and repeats each data len 6 times. Generally rte_memcpy 
is at least 20% faster.



len       memcpy                                  rte_memcpy

256      232   156    88    88    88    88       148    72    68    72    72    
68

 512      208   104   104   104   104   104       136   112    80    80    80   
 80

 768      156   120   120   116   120   120       192   116    92    92    88   
 88

1024      224   136   132   136   136   136       136   100   100   100    96   
100

1280      184   168   152   152   152   152       136   112   104   104   108   
104

1536      200   168   164   164   168   168       156   152   136   140   140   
140

1792      208   212   184   184   180   180       160   132   124   124   120   
120

2048      220   212   204   204   200   200       148   144   128   128   132   
128

2304      252   228   220   216   216   212       152   144   136   140   136   
136

2560      272   240   232   232   228   232       164   144   148   144   144   
148

2816      280   256   248   248   248   248       164   164   152   152   152   
156

3072      296   272   264   264   268   264       188   172   160   160   164   
164

3328      312   288   284   280   284   280       180   176   168   168   172   
168

3584      324   304   300   300   296   296       180   184   176   176   176   
176

3840      340   320   320   316   316   316       208   188   184   188   184   
188

4096      348   348   332   332   332   332       204   204   192   196   196   
192



From: EXT Christophe Milard [mailto:[email protected]]
Sent: Thursday, November 05, 2015 12:53 PM
To: Savolainen, Petri (Nokia - FI/Espoo)
Cc: EXT Maxim Uvarov; LNG ODP Mailman List
Subject: Re: [lng-odp] [API-NEXT PATCH] validation: std_clib: added validation 
tests

Also, I am not sure about why we need to wrap the libC functions in ODP, how 
much we should do it, and how it relates to the problems experienced by 
Nicolas, ODP-224
Maybe somehting for the ARCH call on monday?

On 5 November 2015 at 11:43, Christophe Milard 
<[email protected]<mailto:[email protected]>> wrote:
ok.then it is the right place in the structure. Are you fixing the names, Petri?

On 5 November 2015 at 11:35, Savolainen, Petri (Nokia - FI/Espoo) 
<[email protected]<mailto:[email protected]>> wrote:
/**
* @defgroup odp_std_clib ODP STD CLIB
* @details
* ODP version of often used C library calls
* @{
*/

The module name is “std_clib”. I did try to use that as the module name. You 
can find e.g. std_clib.h in api-next.

-Petri



From: EXT Christophe Milard 
[mailto:[email protected]<mailto:[email protected]>]
Sent: Thursday, November 05, 2015 12:28 PM

To: Savolainen, Petri (Nokia - FI/Espoo)
Cc: EXT Maxim Uvarov; LNG ODP Mailman List
Subject: Re: [lng-odp] [API-NEXT PATCH] validation: std_clib: added validation 
tests

/doc/implementers-guide/implementers-guide.html:

2.1.2. Module test and naming convention

•      Tests, i.e. C functions which are used in CUnit test suites are named: 
<Module>_test_*
where the suffix idendify the test.

•      Test arrays, i.e. arrays of odp_testinfo_t, listing the test functions 
belonging to a suite, are called: <Module>_suite[_*]
where the possible suffix can be used if many suites are declared.

•      CUnit suite init and termination functions are called: 
<Module>_suite[_*]_init() and <Module>_suite[_*]_term() respectively.
where the possible extra middle pattern can be used if many suites are declared.

•      Suite arrays, i.e. arrays of odp_suiteinfo_t used in executables (CUnit 
registry) are called: <Module>_suites[_*]
where the possible suffix identifies the executable using it, if many.

•      Main executable function(s), are called: <Module>_main[_*]
where the possible suffix identifies the executable, if many, using it.

•      Init/term functions for the whole executable are called: <Module>_init 
<Module>_term

All the above symbols are part of the generated libtest<Module>.la libraries. 
The generated main executable(s) (named <module>_main[_*], where the optional 
suffix is used to distinguish the executables belonging to the same module, if 
many) simply call(s) the related <Module>_main[_*] from the library.

On 5 November 2015 at 11:16, Savolainen, Petri (Nokia - FI/Espoo) 
<[email protected]<mailto:[email protected]>> wrote:
What rules exactly?

From: EXT Christophe Milard 
[mailto:[email protected]<mailto:[email protected]>]
Sent: Thursday, November 05, 2015 12:15 PM

To: Savolainen, Petri (Nokia - FI/Espoo)
Cc: EXT Maxim Uvarov; LNG ODP Mailman List
Subject: Re: [lng-odp] [API-NEXT PATCH] validation: std_clib: added validation 
tests

Also, this patch does not respect the test naming convention rules.
/Christophe.

On 5 November 2015 at 11:12, Christophe Milard 
<[email protected]<mailto:[email protected]>> wrote:
but why should ODP tests test the C lib, as it is not part of ODP?
If there is a good reason to do so (which I do not unerstand at this stage), I 
think the test sould be placed elsewhere.

On 5 November 2015 at 11:06, Savolainen, Petri (Nokia - FI/Espoo) 
<[email protected]<mailto:[email protected]>> wrote:
It’s asn ODP module. It tests ODP version of (optimized) common  C lib calls – 
like odp_memcpy()

-Petri

+static void std_clib_test_memcpy(void)
+{
+       uint8_t src[] = {0, 1,  2,  3,  4,  5,  6,  7,
+                        8, 9, 10, 11, 12, 13, 14, 15};
+       uint8_t dst[16];
+       int ret;
+
+       memset(dst, 0, sizeof(dst));
+
+       odp_memcpy(dst, src, sizeof(dst));
+
+       ret = memcmp(dst, src, sizeof(dst));
+
+       CU_ASSERT(ret == 0);
+}

From: EXT Christophe Milard 
[mailto:[email protected]<mailto:[email protected]>]
Sent: Thursday, November 05, 2015 12:02 PM
To: Savolainen, Petri (Nokia - FI/Espoo)
Cc: EXT Maxim Uvarov; LNG ODP Mailman List

Subject: Re: [lng-odp] [API-NEXT PATCH] validation: std_clib: added validation 
tests

This is not a ODP module, is it?  should/could it be one?
I am not sure either what is the point of testing libC? If the question is to 
make sure that libc contains such or such function, I thing we should first 
decide which libC to use.
( see Jira ODP 224 )
But maybe I am missing some point...

/Christophe.

On 5 November 2015 at 09:52, Savolainen, Petri (Nokia - FI/Espoo) 
<[email protected]<mailto:[email protected]>> wrote:
Ping.

From: EXT Bill Fischofer 
[mailto:[email protected]<mailto:[email protected]>]
Sent: Thursday, October 29, 2015 5:27 PM
To: Savolainen, Petri (Nokia - FI/Espoo)
Cc: LNG ODP Mailman List
Subject: Re: [lng-odp] [API-NEXT PATCH] validation: std_clib: added validation 
tests



On Thu, Oct 29, 2015 at 9:52 AM, Petri Savolainen 
<[email protected]<mailto:[email protected]>> wrote:
Added validation tests for ODP std C library API.

Signed-off-by: Petri Savolainen 
<[email protected]<mailto:[email protected]>>

Reviewed-and-Tested-by: Bill Fischofer 
<[email protected]<mailto:[email protected]>>

---
 configure.ac<http://configure.ac>                             |  1 +
 platform/linux-generic/test/Makefile.am  |  1 +
 test/validation/Makefile.am              |  1 +
 test/validation/std_clib/.gitignore      |  1 +
 test/validation/std_clib/Makefile.am     | 10 +++++
 test/validation/std_clib/std_clib.c      | 66 ++++++++++++++++++++++++++++++++
 test/validation/std_clib/std_clib.h      | 21 ++++++++++
 test/validation/std_clib/std_clib_main.c | 12 ++++++
 8 files changed, 113 insertions(+)
 create mode 100644 test/validation/std_clib/.gitignore
 create mode 100644 test/validation/std_clib/Makefile.am
 create mode 100644 test/validation/std_clib/std_clib.c
 create mode 100644 test/validation/std_clib/std_clib.h
 create mode 100644 test/validation/std_clib/std_clib_main.c

diff --git a/configure.ac<http://configure.ac> 
b/configure.ac<http://configure.ac>
index 8e94d82..9887589 100644
--- a/configure.ac<http://configure.ac>
+++ b/configure.ac<http://configure.ac>
@@ -326,6 +326,7 @@ AC_CONFIG_FILES([Makefile
                 test/validation/queue/Makefile
                 test/validation/random/Makefile
                 test/validation/scheduler/Makefile
+                test/validation/std_clib/Makefile
                 test/validation/synchronizers/Makefile
                 test/validation/thread/Makefile
                 test/validation/time/Makefile
diff --git a/platform/linux-generic/test/Makefile.am 
b/platform/linux-generic/test/Makefile.am
index a657de9..24285c1 100644
--- a/platform/linux-generic/test/Makefile.am
+++ b/platform/linux-generic/test/Makefile.am
@@ -19,6 +19,7 @@ TESTS = pktio/pktio_run \
        ${top_builddir}/test/validation/queue/queue_main$(EXEEXT) \
        ${top_builddir}/test/validation/random/random_main$(EXEEXT) \
        ${top_builddir}/test/validation/scheduler/scheduler_main$(EXEEXT) \
+       ${top_builddir}/test/validation/std_clib/std_clib_main$(EXEEXT) \
        
${top_builddir}/test/validation/synchronizers/synchronizers_main$(EXEEXT) \
        ${top_builddir}/test/validation/thread/thread_main$(EXEEXT) \
        ${top_builddir}/test/validation/time/time_main$(EXEEXT) \
diff --git a/test/validation/Makefile.am b/test/validation/Makefile.am
index 4f926ce..1711b93 100644
--- a/test/validation/Makefile.am
+++ b/test/validation/Makefile.am
@@ -12,6 +12,7 @@ ODP_MODULES = buffer \
              pool \
              random \
              scheduler \
+             std_clib \
              synchronizers \
              thread \
              time \
diff --git a/test/validation/std_clib/.gitignore 
b/test/validation/std_clib/.gitignore
new file mode 100644
index 0000000..3782833
--- /dev/null
+++ b/test/validation/std_clib/.gitignore
@@ -0,0 +1 @@
+std_clib_main
diff --git a/test/validation/std_clib/Makefile.am 
b/test/validation/std_clib/Makefile.am
new file mode 100644
index 0000000..aa02be6
--- /dev/null
+++ b/test/validation/std_clib/Makefile.am
@@ -0,0 +1,10 @@
+include ../Makefile.inc
+
+noinst_LTLIBRARIES = libteststd_clib.la<http://libteststd_clib.la>
+libteststd_clib_la_SOURCES = std_clib.c
+
+bin_PROGRAMS = std_clib_main$(EXEEXT)
+dist_std_clib_main_SOURCES = std_clib_main.c
+std_clib_main_LDADD = libteststd_clib.la<http://libteststd_clib.la> 
$(LIBCUNIT_COMMON) $(LIBODP)
+
+EXTRA_DIST = std_clib.h
diff --git a/test/validation/std_clib/std_clib.c 
b/test/validation/std_clib/std_clib.c
new file mode 100644
index 0000000..e53ad39
--- /dev/null
+++ b/test/validation/std_clib/std_clib.c
@@ -0,0 +1,66 @@
+/* Copyright (c) 2015, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include <odp.h>
+#include <odp_cunit_common.h>
+#include "std_clib.h"
+
+#include <string.h>
+
+#define PATTERN 0x5e
+
+static void std_clib_test_memcpy(void)
+{
+       uint8_t src[] = {0, 1,  2,  3,  4,  5,  6,  7,
+                        8, 9, 10, 11, 12, 13, 14, 15};
+       uint8_t dst[16];
+       int ret;
+
+       memset(dst, 0, sizeof(dst));
+
+       odp_memcpy(dst, src, sizeof(dst));
+
+       ret = memcmp(dst, src, sizeof(dst));
+
+       CU_ASSERT(ret == 0);
+}
+
+static void std_clib_test_memset(void)
+{
+       uint8_t data[] = {0, 1,  2,  3,  4,  5,  6,  7,
+                         8, 9, 10, 11, 12, 13, 14, 15};
+       uint8_t ref[16];
+       int ret;
+
+       odp_memset(data, PATTERN, sizeof(data));
+
+       memset(ref, PATTERN, sizeof(ref));
+
+       ret = memcmp(data, ref, sizeof(data));
+
+       CU_ASSERT(ret == 0);
+}
+
+odp_testinfo_t std_clib_suite[] = {
+       ODP_TEST_INFO(std_clib_test_memcpy),
+       ODP_TEST_INFO(std_clib_test_memset),
+       ODP_TEST_INFO_NULL,
+};
+
+odp_suiteinfo_t std_clib_suites[] = {
+       {"Std C library", NULL, NULL, std_clib_suite},
+       ODP_SUITE_INFO_NULL
+};
+
+int std_clib_main(void)
+{
+       int ret = odp_cunit_register(std_clib_suites);
+
+       if (ret == 0)
+               ret = odp_cunit_run();
+
+       return ret;
+}
diff --git a/test/validation/std_clib/std_clib.h 
b/test/validation/std_clib/std_clib.h
new file mode 100644
index 0000000..eab6872
--- /dev/null
+++ b/test/validation/std_clib/std_clib.h
@@ -0,0 +1,21 @@
+/* Copyright (c) 2015, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#ifndef _ODP_TEST_STD_CLIB_H_
+#define _ODP_TEST_STD_CLIB_H_
+
+#include <odp_cunit_common.h>
+
+/* test arrays: */
+extern odp_testinfo_t std_clib_suite[];
+
+/* test registry: */
+extern odp_suiteinfo_t std_clib_suites[];
+
+/* main test program: */
+int std_clib_main(void);
+
+#endif
diff --git a/test/validation/std_clib/std_clib_main.c 
b/test/validation/std_clib/std_clib_main.c
new file mode 100644
index 0000000..010c1c6
--- /dev/null
+++ b/test/validation/std_clib/std_clib_main.c
@@ -0,0 +1,12 @@
+/* Copyright (c) 2015, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include "std_clib.h"
+
+int main(void)
+{
+       return std_clib_main();
+}
--
2.6.2

_______________________________________________
lng-odp mailing list
[email protected]<mailto:[email protected]>
https://lists.linaro.org/mailman/listinfo/lng-odp


_______________________________________________
lng-odp mailing list
[email protected]<mailto:[email protected]>
https://lists.linaro.org/mailman/listinfo/lng-odp






_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to