[dpdk-dev] [PATCH 1/2] net: add arm64 neon version of CRC compute APIs

Jan Viktorin viktorin at rehivetech.com
Wed May 3 18:58:00 CEST 2017


On Fri, 28 Apr 2017 10:19:20 +0000
"Sekhar, Ashwin" <Ashwin.Sekhar at cavium.com> wrote:

> Hi Jan,
> Thanks for the comments. Please see my responses inline.
> 
> On Friday 28 April 2017 03:25 PM, Jan Viktorin wrote:
> > Hello Ashwin Sekhar,
> >
> > some comments below...
> >

[...]

> >>
> >>  #include <stdint.h>
> >> +#include <assert.h>
> >> +

I'd prefer RTE_ASSERT (rte_debug.h) instead of this one.

> >>  #include "generic/rte_vect.h"
> >>  #include "arm_neon.h"
> >>
> >> +#ifdef GCC_VERSION
> >> +#undef GCC_VERSION
> >> +#endif  
> >
> > Why are you doing this? What is wrong with GCC_VERSION?
> >  
> This is just to avoid multiple definitions of GCC_VERSION. Not required 
> really. Can be removed.
> 
> >> +
> >> +#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 \
> >> +			+ __GNUC_PATCHLEVEL__)
> >> +  
> >
> > If you have any specific requirements for testing GCC version then it
> > should be done in a more elegant way. However, I do not understand your
> > intention.
> >  
> GCC version is checked so as to define wrappers for some neon intrinsics 
> which are not available in GCC versions < 7.
> 
> Similar checks of GCC_VERSION done in ./lib/librte_table/rte_lru.h. 
> Followed the same template here.
> Also, this is the suggested approach by GCC. Please see below link.
> https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html

This is OK, I understand.

> 
> Please advise on more elegant ways of gcc version detection.

I don't say that it is wrong. Just, it is quite a low-level definition
that might be solved once for all to avoid any further GCC_VERSION
definitions.

At least, I would go this way:

#ifdef __GNUC__
#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
#else
#define GCC_VERSION 0
#endif

To be better, this should be defined in some more general file
(rte_common.h, rte_compiler.h)? I don't have any strong opinion about
this. The rte_lru.h can be refactorized in the same way.

> >>  #ifdef __cplusplus
> >>  extern "C" {
> >>  #endif
> >> @@ -78,6 +87,42 @@ vqtbl1q_u8(uint8x16_t a, uint8x16_t b)
> >>  }
> >>  #endif
> >>
> >> +#if (GCC_VERSION < 70000)  
> >

[...]

> >  
> >>  # CPU_LDFLAGS =
> >>  # CPU_ASFLAGS =
> >>
> >> -MACHINE_CFLAGS += -march=armv8-a+crc
> >> +MACHINE_CFLAGS += -march=armv8-a+crc+crypto
> >> diff --git a/mk/machine/thunderx/rte.vars.mk b/mk/machine/thunderx/rte.vars.mk
> >> index ad5a379..6784105 100644
> >> --- a/mk/machine/thunderx/rte.vars.mk
> >> +++ b/mk/machine/thunderx/rte.vars.mk
> >> @@ -55,4 +55,4 @@
> >>  # CPU_LDFLAGS =
> >>  # CPU_ASFLAGS =
> >>
> >> -MACHINE_CFLAGS += -march=armv8-a+crc -mcpu=thunderx
> >> +MACHINE_CFLAGS += -march=armv8-a+crc+crypto -mcpu=thunderx
> >> diff --git a/mk/rte.cpuflags.mk b/mk/rte.cpuflags.mk
> >> index e634abc..6bbd742 100644
> >> --- a/mk/rte.cpuflags.mk
> >> +++ b/mk/rte.cpuflags.mk
> >> @@ -119,6 +119,9 @@ ifneq ($(filter $(AUTO_CPUFLAGS),__ARM_FEATURE_CRC32),)
> >>  CPUFLAGS += CRC32
> >>  endif
> >>
> >> +ifneq ($(filter $(AUTO_CPUFLAGS),__ARM_FEATURE_CRYPTO),)
> >> +CPUFLAGS += PMULL
> >> +endif
> >>
> >>  MACHINE_CFLAGS += $(addprefix -DRTE_MACHINE_CPUFLAG_,$(CPUFLAGS))
> >>
> >> diff --git a/mk/toolchain/gcc/rte.toolchain-compat.mk b/mk/toolchain/gcc/rte.toolchain-compat.mk
> >> index 280dde2..01ac7e2 100644
> >> --- a/mk/toolchain/gcc/rte.toolchain-compat.mk
> >> +++ b/mk/toolchain/gcc/rte.toolchain-compat.mk
> >> @@ -60,6 +60,7 @@ else
> >>  #
> >>  	ifeq ($(shell test $(GCC_VERSION) -le 49 && echo 1), 1)
> >>  		MACHINE_CFLAGS := $(patsubst -march=armv8-a+crc,-march=armv8-a+crc -D__ARM_FEATURE_CRC32=1,$(MACHINE_CFLAGS))  
> >
> > The line above is to be dropped, isn't it?
> >  
> No. It is not to be dropped. For targets like xgene1, crypto is not 
> defined. Above line is required for the substitution to happen in such 
> targets.

Yes, I understand...

> >> +		MACHINE_CFLAGS := $(patsubst -march=armv8-a+crc+crypto,-march=armv8-a+crc+crypto -D__ARM_FEATURE_CRC32=1,$(MACHINE_CFLAGS))  
> >
> > Please, split the "feature-detection" changes into a separate commit and
> > explain it. In the code, you test for GCC 7. Here you are ok with GCC
> > 4.9. It's likely to be correct but it is not clear.  
> Sure. Will split the feature detection changes to separate commit.
> >
> > Also, please explain why is the "crypto" feature required.  
> crypto feature is required for using the vmull_p64 intrinsic. More 
> specifically the PMULL instruction.
> Will add this as part of the commit message.

OK.

Jan

> >
> > Regards
> > Jan
> >  
> >>  	endif
> >>  	ifeq ($(shell test $(GCC_VERSION) -le 47 && echo 1), 1)
> >>  		MACHINE_CFLAGS := $(patsubst -march=core-avx-i,-march=corei7-avx,$(MACHINE_CFLAGS))  
> >  
> Thanks and Regards,
> Ashwin
> 



-- 
   Jan Viktorin                  E-mail: Viktorin at RehiveTech.com
   System Architect              Web:    www.RehiveTech.com
   RehiveTech
   Brno, Czech Republic


More information about the dev mailing list