Correction.  I see rte_memcpy.h is broken down by ARCH directory and in the
x86 directory is various hoop jumping. However I also found an interesting
performance study at
http://nadeausoftware.com/articles/2012/05/c_c_tip_how_copy_memory_quickly
on this subject.

Money quote:

   - memcpy( ) is always the fastest method to copy data. A great compiler,
   like ICC, can optimize loops to do as well.

This is a good example of letting the compiler do it's job.  In almost all
cases memcpy() is treated as a compiler intrinsic, allowing the compiler to
do all of its tricks to achieve best performance.

On Fri, Oct 16, 2015 at 7:55 AM, Bill Fischofer <[email protected]>
wrote:

> DPDK contains the line:
>
> #define rte_memcpy(d, s, n) memcpy((d), (s), (n))
>
> All of the other definitions in rte_memcpy.h for the various "optimized"
> moves do the same. So I'm not sure what's the point here. It's not as if
> these functions aren't already heavily optimized by C compilers.
>
> On Fri, Oct 16, 2015 at 7:22 AM, Savolainen, Petri (Nokia - FI/Espoo) <
> [email protected]> wrote:
>
>> If that’s the case an platform can implement these without extra effort.
>> But when that’s not the case, an implementation can use whatever special
>> instructions, vector engines or DMA HW it has to speed up these calls. See
>> e.g. rte_memcpy in DPDK - it’s not just plain memcpy wrapper (they must
>> have had a reason for optimizing it).
>>
>>
>>
>> -Petri
>>
>>
>>
>> *From:* EXT Bill Fischofer [mailto:[email protected]]
>> *Sent:* Friday, October 16, 2015 3:17 PM
>> *To:* Savolainen, Petri (Nokia - FI/Espoo)
>> *Cc:* LNG ODP Mailman List
>> *Subject:* Re: [lng-odp] [API-NEXT PATCH] api: clib: added standard c
>> library api
>>
>>
>>
>> Why would you not expect a platform to provide an optimized
>> implementation of these stdlib functions itself?  GCC, in particular, seems
>> to do a good job of this for most platforms.
>>
>>
>>
>> On Fri, Oct 16, 2015 at 7:13 AM, Petri Savolainen <
>> [email protected]> wrote:
>>
>> Some C library calls are often used in data plane code. This
>> API enables possibility to HW optimized implementation of those.
>> Added first memcpy and memset.
>>
>> Signed-off-by: Petri Savolainen <[email protected]>
>> ---
>>  include/odp.h                                 |  1 +
>>  include/odp/api/std_clib.h                    | 64
>> +++++++++++++++++++++++++++
>>  platform/linux-generic/Makefile.am            |  2 +
>>  platform/linux-generic/include/odp/std_clib.h | 30 +++++++++++++
>>  4 files changed, 97 insertions(+)
>>  create mode 100644 include/odp/api/std_clib.h
>>  create mode 100644 platform/linux-generic/include/odp/std_clib.h
>>
>> diff --git a/include/odp.h b/include/odp.h
>> index 825c7e1..f2cd2d3 100644
>> --- a/include/odp.h
>> +++ b/include/odp.h
>> @@ -56,6 +56,7 @@ extern "C" {
>>  #include <odp/thrmask.h>
>>  #include <odp/spinlock_recursive.h>
>>  #include <odp/rwlock_recursive.h>
>> +#include <odp/std_clib.h>
>>
>>  #ifdef __cplusplus
>>  }
>> diff --git a/include/odp/api/std_clib.h b/include/odp/api/std_clib.h
>> new file mode 100644
>> index 0000000..2119ec4
>> --- /dev/null
>> +++ b/include/odp/api/std_clib.h
>> @@ -0,0 +1,64 @@
>> +/* Copyright (c) 2015, Linaro Limited
>> + * All rights reserved.
>> + *
>> + * SPDX-License-Identifier:     BSD-3-Clause
>> + */
>> +
>> +/**
>> + * @file
>> + *
>> + * ODP version of often used C library calls
>> + */
>> +
>> +#ifndef ODP_API_STD_CLIB_H_
>> +#define ODP_API_STD_CLIB_H_
>> +
>> +#ifdef __cplusplus
>> +extern "C" {
>> +#endif
>> +
>> +/**
>> + * @defgroup odp_std_clib ODP STD CLIB
>> + * @details
>> + * ODP version of often used C library calls
>> + * @{
>> + */
>> +
>> +/**
>> + * Memcpy
>> + *
>> + * ODP version of C library memcpy function. It copies 'num' bytes from
>> source
>> + * to destination address. Source and destination memory blocks must not
>> + * overlap.
>> + *
>> + * @param dst    Pointer to destination memory block
>> + * @param src    Pointer to source memory block
>> + * @param num    Number of bytes to copy
>> + *
>> + * @return 'dst' address
>> + */
>> +void *odp_memcpy(void *dst, const void *src, size_t num);
>> +
>> +/**
>> + * Memset
>> + *
>> + * ODP version of C library memset function. It sets 'value' to first
>> 'num'
>> + * bytes of memory block pointed by 'ptr'.
>> + *
>> + * @param ptr    Pointer to the memory block
>> + * @param value  Value to be set
>> + * @param num    Number of bytes to set
>> + *
>> + * @return 'ptr' address
>> + */
>> +void *odp_memset(void *ptr, int value, size_t num);
>> +
>> +/**
>> + * @}
>> + */
>> +
>> +#ifdef __cplusplus
>> +}
>> +#endif
>> +
>> +#endif
>> diff --git a/platform/linux-generic/Makefile.am
>> b/platform/linux-generic/Makefile.am
>> index 85c976d..fc202cc 100644
>> --- a/platform/linux-generic/Makefile.am
>> +++ b/platform/linux-generic/Makefile.am
>> @@ -41,6 +41,7 @@ odpinclude_HEADERS = \
>>                   $(srcdir)/include/odp/shared_memory.h \
>>                   $(srcdir)/include/odp/spinlock.h \
>>                   $(srcdir)/include/odp/spinlock_recursive.h \
>> +                 $(srcdir)/include/odp/std_clib.h \
>>                   $(srcdir)/include/odp/std_types.h \
>>                   $(srcdir)/include/odp/sync.h \
>>                   $(srcdir)/include/odp/system_info.h \
>> @@ -108,6 +109,7 @@ odpapiinclude_HEADERS = \
>>                   $(top_srcdir)/include/odp/api/shared_memory.h \
>>                   $(top_srcdir)/include/odp/api/spinlock.h \
>>                   $(top_srcdir)/include/odp/api/spinlock_recursive.h \
>> +                 $(top_srcdir)/include/odp/api/std_clib.h \
>>                   $(top_srcdir)/include/odp/api/std_types.h \
>>                   $(top_srcdir)/include/odp/api/sync.h \
>>                   $(top_srcdir)/include/odp/api/system_info.h \
>> diff --git a/platform/linux-generic/include/odp/std_clib.h
>> b/platform/linux-generic/include/odp/std_clib.h
>> new file mode 100644
>> index 0000000..c939c48
>> --- /dev/null
>> +++ b/platform/linux-generic/include/odp/std_clib.h
>> @@ -0,0 +1,30 @@
>> +/* Copyright (c) 2015, Linaro Limited
>> + * All rights reserved.
>> + *
>> + * SPDX-License-Identifier:     BSD-3-Clause
>> + */
>> +
>> +#ifndef ODP_PLAT_STD_CLIB_H_
>> +#define ODP_PLAT_STD_CLIB_H_
>> +
>> +#ifdef __cplusplus
>> +extern "C" {
>> +#endif
>> +
>> +#include <odp/api/std_types.h>
>> +
>> +static inline void *odp_memcpy(void *dst, const void *src, size_t num)
>> +{
>> +       return memcpy(dst, src, num);
>> +}
>> +
>> +static inline void *odp_memset(void *ptr, int value, size_t num)
>> +{
>> +       return memset(ptr, value, num);
>> +}
>> +
>> +#ifdef __cplusplus
>> +}
>> +#endif
>> +
>> +#endif
>> --
>> 2.6.0
>>
>> _______________________________________________
>> lng-odp mailing list
>> [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