[dpdk-dev,v7,1/3] eal: introduce integer divide through reciprocal
Checks
Commit Message
In some use cases of integer division, denominator remains constant and
numerator varies. It is possible to optimize division for such specific
scenarios.
The librte_sched uses rte_reciprocal to optimize division so, moving it to
eal/common would allow other libraries and applications to use it.
Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
---
v7 changes:
- reworked u64 division (follows same flow as 32bit).
- addressed review comments from v6 (Undo cosmetic changes to 32bit division)
v6 changes:
- remove cache alignment from rte_reciprocal_u{32/64}structures as they would
be embedded in other structures.
v5 changes:
- fix test print strings
v4 changes:
- minor fix for test cases
- fix u32 divisor generation
v3 changes:
- fix x86_32 compilation issue
- fix improper licence in test
v2 changes:
- fix compilation issues with .map files
- add test cases for correctness and performance
- remove extra licence inclusion
- fix coding style issues
lib/librte_eal/bsdapp/eal/Makefile | 1 +
lib/librte_eal/common/Makefile | 1 +
lib/{librte_sched => librte_eal/common/include}/rte_reciprocal.h | 0
lib/{librte_sched => librte_eal/common}/rte_reciprocal.c | 0
lib/librte_eal/linuxapp/eal/Makefile | 1 +
lib/librte_eal/rte_eal_version.map | 7 +++++++
lib/librte_sched/Makefile | 2 --
lib/librte_sched/rte_sched.c | 2 +-
8 files changed, 11 insertions(+), 3 deletions(-)
rename lib/{librte_sched => librte_eal/common/include}/rte_reciprocal.h (100%)
rename lib/{librte_sched => librte_eal/common}/rte_reciprocal.c (100%)
--
2.14.1
Comments
> -----Original Message-----
> From: Pavan Nikhilesh [mailto:pbhagavatula@caviumnetworks.com]
> Sent: Monday, December 4, 2017 1:22 PM
> To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>;
> stephen@networkplumber.org; ktraynor@redhat.com
> Cc: dev@dpdk.org; Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
> Subject: [dpdk-dev] [PATCH v7 1/3] eal: introduce integer divide through
> reciprocal
>
> In some use cases of integer division, denominator remains constant and
> numerator varies. It is possible to optimize division for such specific
> scenarios.
>
> The librte_sched uses rte_reciprocal to optimize division so, moving it to
> eal/common would allow other libraries and applications to use it.
>
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
> ---
>
> v7 changes:
> - reworked u64 division (follows same flow as 32bit).
> - addressed review comments from v6 (Undo cosmetic changes to 32bit
> division)
>
> v6 changes:
> - remove cache alignment from rte_reciprocal_u{32/64}structures as they
> would
> be embedded in other structures.
>
> v5 changes:
> - fix test print strings
>
> v4 changes:
> - minor fix for test cases
> - fix u32 divisor generation
>
> v3 changes:
> - fix x86_32 compilation issue
> - fix improper licence in test
>
> v2 changes:
> - fix compilation issues with .map files
> - add test cases for correctness and performance
> - remove extra licence inclusion
> - fix coding style issues
>
> lib/librte_eal/bsdapp/eal/Makefile | 1 +
> lib/librte_eal/common/Makefile | 1 +
> lib/{librte_sched => librte_eal/common/include}/rte_reciprocal.h | 0
> lib/{librte_sched => librte_eal/common}/rte_reciprocal.c | 0
> lib/librte_eal/linuxapp/eal/Makefile | 1 +
> lib/librte_eal/rte_eal_version.map | 7 +++++++
> lib/librte_sched/Makefile | 2 --
> lib/librte_sched/rte_sched.c | 2 +-
> 8 files changed, 11 insertions(+), 3 deletions(-)
> rename lib/{librte_sched => librte_eal/common/include}/rte_reciprocal.h
> (100%)
> rename lib/{librte_sched => librte_eal/common}/rte_reciprocal.c (100%)
>
> diff --git a/lib/librte_eal/bsdapp/eal/Makefile
> b/lib/librte_eal/bsdapp/eal/Makefile
> index afa117de4..b0442a75d 100644
> --- a/lib/librte_eal/bsdapp/eal/Makefile
> +++ b/lib/librte_eal/bsdapp/eal/Makefile
> @@ -84,6 +84,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) +=
> malloc_elem.c
> SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += malloc_heap.c
> SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += rte_keepalive.c
> SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += rte_service.c
> +SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += rte_reciprocal.c
>
> # from arch dir
> SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += rte_cpuflags.c
> diff --git a/lib/librte_eal/common/Makefile
> b/lib/librte_eal/common/Makefile
> index 9effd0d45..ed0d3f80b 100644
> --- a/lib/librte_eal/common/Makefile
> +++ b/lib/librte_eal/common/Makefile
> @@ -44,6 +44,7 @@ INC += rte_pci_dev_feature_defs.h
> rte_pci_dev_features.h
> INC += rte_malloc.h rte_keepalive.h rte_time.h
> INC += rte_service.h rte_service_component.h
> INC += rte_bitmap.h rte_vfio.h
> +INC += rte_reciprocal.h
>
> GENERIC_INC := rte_atomic.h rte_byteorder.h rte_cycles.h rte_prefetch.h
> GENERIC_INC += rte_spinlock.h rte_memcpy.h rte_cpuflags.h rte_rwlock.h
> diff --git a/lib/librte_sched/rte_reciprocal.h
> b/lib/librte_eal/common/include/rte_reciprocal.h
> similarity index 100%
> rename from lib/librte_sched/rte_reciprocal.h
> rename to lib/librte_eal/common/include/rte_reciprocal.h
> diff --git a/lib/librte_sched/rte_reciprocal.c
> b/lib/librte_eal/common/rte_reciprocal.c
> similarity index 100%
> rename from lib/librte_sched/rte_reciprocal.c
> rename to lib/librte_eal/common/rte_reciprocal.c
> diff --git a/lib/librte_eal/linuxapp/eal/Makefile
> b/lib/librte_eal/linuxapp/eal/Makefile
> index 5a7b8b2ac..ce65d5ccc 100644
> --- a/lib/librte_eal/linuxapp/eal/Makefile
> +++ b/lib/librte_eal/linuxapp/eal/Makefile
> @@ -91,6 +91,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) +=
> malloc_elem.c
> SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += malloc_heap.c
> SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += rte_keepalive.c
> SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += rte_service.c
> +SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += rte_reciprocal.c
>
> # from arch dir
> SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += rte_cpuflags.c
> diff --git a/lib/librte_eal/rte_eal_version.map
> b/lib/librte_eal/rte_eal_version.map
> index f4f46c1be..d8b968c5c 100644
> --- a/lib/librte_eal/rte_eal_version.map
> +++ b/lib/librte_eal/rte_eal_version.map
> @@ -200,6 +200,13 @@ DPDK_17.11 {
>
> } DPDK_17.08;
>
> +DPDK_18.02 {
> + global:
> +
> + rte_reciprocal_value;
> +
> +} DPDK_17.11;
> +
> EXPERIMENTAL {
> global:
>
> diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
> index 04785f720..535b23d76 100644
> --- a/lib/librte_sched/Makefile
> +++ b/lib/librte_sched/Makefile
> @@ -54,10 +54,8 @@ LIBABIVER := 1
> # all source are stored in SRCS-y
> #
> SRCS-$(CONFIG_RTE_LIBRTE_SCHED) += rte_sched.c rte_red.c rte_approx.c
> -SRCS-$(CONFIG_RTE_LIBRTE_SCHED) += rte_reciprocal.c
>
> # install includes
> SYMLINK-$(CONFIG_RTE_LIBRTE_SCHED)-include := rte_sched.h
> rte_sched_common.h rte_red.h rte_approx.h
> -SYMLINK-$(CONFIG_RTE_LIBRTE_SCHED)-include += rte_reciprocal.h
>
> include $(RTE_SDK)/mk/rte.lib.mk
> diff --git a/lib/librte_sched/rte_sched.c b/lib/librte_sched/rte_sched.c
> index 7252f850d..35c5c3cde 100644
> --- a/lib/librte_sched/rte_sched.c
> +++ b/lib/librte_sched/rte_sched.c
> @@ -43,11 +43,11 @@
> #include <rte_branch_prediction.h>
> #include <rte_mbuf.h>
> #include <rte_bitmap.h>
> +#include <rte_reciprocal.h>
>
> #include "rte_sched.h"
> #include "rte_sched_common.h"
> #include "rte_approx.h"
> -#include "rte_reciprocal.h"
>
> #ifdef __INTEL_COMPILER
> #pragma warning(disable:2259) /* conversion may lose significant bits */
> --
> 2.14.1
Hi Pavan,
To make progress on this patch set, I suggest you split and resend this exact patch as a standalone patch set, so we at least move the existing 32-bit version from librte_sched to EAL for other libs/apps could use it.
Regards,
Cristian
@@ -84,6 +84,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += malloc_elem.c
SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += malloc_heap.c
SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += rte_keepalive.c
SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += rte_service.c
+SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += rte_reciprocal.c
# from arch dir
SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += rte_cpuflags.c
@@ -44,6 +44,7 @@ INC += rte_pci_dev_feature_defs.h rte_pci_dev_features.h
INC += rte_malloc.h rte_keepalive.h rte_time.h
INC += rte_service.h rte_service_component.h
INC += rte_bitmap.h rte_vfio.h
+INC += rte_reciprocal.h
GENERIC_INC := rte_atomic.h rte_byteorder.h rte_cycles.h rte_prefetch.h
GENERIC_INC += rte_spinlock.h rte_memcpy.h rte_cpuflags.h rte_rwlock.h
similarity index 100%
rename from lib/librte_sched/rte_reciprocal.h
rename to lib/librte_eal/common/include/rte_reciprocal.h
similarity index 100%
rename from lib/librte_sched/rte_reciprocal.c
rename to lib/librte_eal/common/rte_reciprocal.c
@@ -91,6 +91,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += malloc_elem.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += malloc_heap.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += rte_keepalive.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += rte_service.c
+SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += rte_reciprocal.c
# from arch dir
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += rte_cpuflags.c
@@ -200,6 +200,13 @@ DPDK_17.11 {
} DPDK_17.08;
+DPDK_18.02 {
+ global:
+
+ rte_reciprocal_value;
+
+} DPDK_17.11;
+
EXPERIMENTAL {
global:
@@ -54,10 +54,8 @@ LIBABIVER := 1
# all source are stored in SRCS-y
#
SRCS-$(CONFIG_RTE_LIBRTE_SCHED) += rte_sched.c rte_red.c rte_approx.c
-SRCS-$(CONFIG_RTE_LIBRTE_SCHED) += rte_reciprocal.c
# install includes
SYMLINK-$(CONFIG_RTE_LIBRTE_SCHED)-include := rte_sched.h rte_sched_common.h rte_red.h rte_approx.h
-SYMLINK-$(CONFIG_RTE_LIBRTE_SCHED)-include += rte_reciprocal.h
include $(RTE_SDK)/mk/rte.lib.mk
@@ -43,11 +43,11 @@
#include <rte_branch_prediction.h>
#include <rte_mbuf.h>
#include <rte_bitmap.h>
+#include <rte_reciprocal.h>
#include "rte_sched.h"
#include "rte_sched_common.h"
#include "rte_approx.h"
-#include "rte_reciprocal.h"
#ifdef __INTEL_COMPILER
#pragma warning(disable:2259) /* conversion may lose significant bits */