DPDK patches and discussions
 help / color / mirror / Atom feed
From: Wathsala Wathawana Vithanage <wathsala.vithanage@arm.com>
To: Pavan Nikhilesh Bhagavatula <pbhagavatula@marvell.com>,
	Honnappa Nagarahalli <Honnappa.Nagarahalli@arm.com>
Cc: "jerinj@marvell.com" <jerinj@marvell.com>,
	"juraj.linkes@pantheon.tech" <juraj.linkes@pantheon.tech>,
	Bruce Richardson <bruce.richardson@intel.com>,
	"dev@dpdk.org" <dev@dpdk.org>, nd <nd@arm.com>, nd <nd@arm.com>
Subject: RE: [PATCH v3 1/3] config/arm: avoid mcpu and march conflicts
Date: Wed, 7 Feb 2024 00:01:43 +0000	[thread overview]
Message-ID: <AM0PR08MB507331597463150A118A0E049F452@AM0PR08MB5073.eurprd08.prod.outlook.com> (raw)
In-Reply-To: <PH0PR18MB4086C9E9D7730067E136E194DE462@PH0PR18MB4086.namprd18.prod.outlook.com>

> > <wathsala.vithanage@arm.com> wrote:
> > >
> > > Hi Pavan,
> > >
> > >> The compiler options march and mtune are a subset of mcpu and will
> > >> lead
> > to
> > >> conflicts if improper march is chosen for a given mcpu.
> > >> To avoid conflicts, force part number march when mcpu is available
> > >> and is supported by the compiler.
> > >
> > > Why would one force the march specified in the part number when mcpu
> > > for that part number is also available and supported by the compiler?
> > >
> > It would be good to explain the use case or the problem being faced.
> >
> 
> The idea of this patchset is to avoid mcpu and march conflicts that can happen
> with the current build flow.
> 
> #aarch64-linux-gnu-gcc -mcpu=neoverse-n2 -march=armv8.6-a shrn.c
> cc1: warning: switch '-mcpu=neoverse-n2' conflicts with '-march=armv8.6-a'
> 
> In some versions of GCC mcpu=neoverse-n2 is supported but -march=armv9-
> a is not so, current build flow will choose the next supported march which is
> armv8.6-a and report a conflict.
> 
If compiler support is available for a certain CPU, then it is safe to assume that the
Compiler knows the best architecture to use.
Therefore, in such cases the best practice is to not provide -march.

> > >>
> > >> Example:
> > >> march = armv9-a
> > >> mcpu = neoverse-n2
> > >>
> > >> mcpu supported, march supported
> > >> machine_args = ['-mcpu=neoverse-n2', '-march=armv9-a']
> > >
> > > -march restricts the compiler to baseline architecture of the -mcpu.
> > > For instance, Neoverse-n1's baseline architecture is armv8.2-a, but
> > > it has some extensions from armv8.3-a, armv8.4-a, and armv8.5-a.
> > > By setting -march to armv8.2-a the compiler will strictly omit
> > > extensions from 8.3, 8.4 and 8.5 resulting in a suboptimal outcome.
> 
> What if compiler only supports armv8.2-a?
> Are you suggesting we don’t use march at all when mcpu is supported?
> If so how do you express extensions that the SoC supports?
> Neoverse-n2 has optional support for crypto and can only be enabled by
> expressing it through march='armv9-a+crypto'
> 
March extensions also works with mcpu, use mcpu=neoverse-n2+crypto
instead of march.  It's documented in "-march and -mcpu Feature Modifiers"
section in gcc manual.

> > >
> > >>
> > >> mcpu supported, march not supported machine_args =
> > >> ['-mcpu=neoverse-n2']
> > >
> > > This will result in the best outcome.
> 
> Isn't -mcpu=neoverse-n2 -march=armv9-a+sve2+crypto also the best
> outcome?
> 
Here also we can append feature modifiers like sve2 and crypto to CPU in
-mcpu and drop -march arg.
If the compiler supports neoverse-n2 but not armv9-a it will pick the next
best architecture. 
-mcpu=neoverse-n2+sve2+crypto can replace - march=armv9-a+sve2+crypto

> > >
> > >>
> > >> mcpu not supported, march supported machine_args =
> > >> ['-march=armv9-a']
> > >
> > > This too may result in a suboptimal outcome as optimization space is
> > > limited to the given march (not using extensions from later
> > > architectures when available).
> > >
> 
> What if compiler doesn’t support mcpu=neoverse-n2 and only supports
> march=armv9-a
> 
I agree there can be such corner cases where CPU enablement isn't done.
Such cases can be handled with a new meson build parameter like 
-Dplatform=generic-armv9 to build armv9-a binaries (similar to 
-Dplatform=generic that builds armv8-a binaries today).
Having such parameter forces the user to make a conscious decision rather 
than build system doing it for them.
It also comes with the added benefit of having a simpler build system.

> > >>
> > >> mcpu not supported, march not supported machine_args =
> > >> ['-march=armv8.6-a']
> > >
> > > Compiler knows nothing about the target CPU or the architecture.
> > > I think it's better to exit the build process with an error.
> > >
> 
> Then we would need to mark all old GCC versions as not supported by a newer
> SoC I don’t think that’s needed since the binaries still run but not optimally,
> currently we have a warning in place for march mismatch.
> 
We don't have to deprecate older versions of GCC.
I'm suggesting two options to let the user have greater autonomy on
the kind of the binary they want rather than ending up with a binary
the build system forced on them.
Today -Dplatform=generic does something similar to this with armv8,
it simply directs the build system to output an armv8 without any extras. 
First suggestion is that we simply have a -Dplatform=generic-armv9 that
does the same but for armv9.
The second suggestion is to empower a sophisticated user even further
to override everything in the build system including generics via two 
parameters -Dmarch and -Dmcpu to set an arbitrary architecture and a cpu.
Second option works as a catch-all for every unorthodox request that may
come our way. Both these features can be suggested when build exits due
to compiler not knowing the target CPU or the architecture.
I think these parameters keep user in charge with a simpler build system.

> > >>
> > >> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> > >> ---
> > >> v2 Changes:
> > >> - Cleanup march inconsistencies. (Juraj Linkes)
> > >> - Unify fallback march selection. (Juraj Linkes)
> > >> - Tag along ARM WFE patch.
> > >> v3 Changes:
> > >> - Fix missing 'fallback_march' key check.
> > >>
> > >> config/arm/meson.build | 108 +++++++++++++++++++++++++-----------
> --
> > --
> > >> -
> > >> 1 file changed, 66 insertions(+), 42 deletions(-)
> > >>
> > >> diff --git a/config/arm/meson.build b/config/arm/meson.build index
> > >> 36f21d22599a..ba859bd060b5 100644
> > >> --- a/config/arm/meson.build
> > >> +++ b/config/arm/meson.build
> > >> @@ -58,18 +58,18 @@ implementer_generic = {  }
> > >>
> > >> part_number_config_arm = {
> > >> -    '0xd03': {'compiler_options':  ['-mcpu=cortex-a53']},
> > >> -    '0xd04': {'compiler_options':  ['-mcpu=cortex-a35']},
> > >> -    '0xd05': {'compiler_options':  ['-mcpu=cortex-a55']},
> > >> -    '0xd07': {'compiler_options':  ['-mcpu=cortex-a57']},
> > >> -    '0xd08': {'compiler_options':  ['-mcpu=cortex-a72']},
> > >> -    '0xd09': {'compiler_options':  ['-mcpu=cortex-a73']},
> > >> -    '0xd0a': {'compiler_options':  ['-mcpu=cortex-a75']},
> > >> -    '0xd0b': {'compiler_options':  ['-mcpu=cortex-a76']},
> > >> +    '0xd03': {'mcpu': 'cortex-a53'},
> > >> +    '0xd04': {'mcpu': 'cortex-a35'},
> > >> +    '0xd05': {'mcpu': 'cortex-a55'},
> > >> +    '0xd07': {'mcpu': 'cortex-a57'},
> > >> +    '0xd08': {'mcpu': 'cortex-a72'},
> > >> +    '0xd09': {'mcpu': 'cortex-a73'},
> > >> +    '0xd0a': {'mcpu': 'cortex-a75'},
> > >> +    '0xd0b': {'mcpu': 'cortex-a76'},
> > >>     '0xd0c': {
> > >>         'march': 'armv8.2-a',
> > >>         'march_features': ['crypto', 'rcpc'],
> > >> -        'compiler_options':  ['-mcpu=neoverse-n1'],
> > >> +        'mcpu': 'neoverse-n1',
> > >>         'flags': [
> > >>             ['RTE_MACHINE', '"neoverse-n1"'],
> > >>             ['RTE_ARM_FEATURE_ATOMICS', true], @@ -81,7 +81,7 @@
> > >> part_number_config_arm = {
> > >>     '0xd40': {
> > >>         'march': 'armv8.4-a',
> > >>         'march_features': ['sve'],
> > >> -        'compiler_options':  ['-mcpu=neoverse-v1'],
> > >> +        'mcpu': 'neoverse-v1',
> > >>         'flags': [
> > >>             ['RTE_MACHINE', '"neoverse-v1"'],
> > >>             ['RTE_ARM_FEATURE_ATOMICS', true], @@ -92,8 +92,9 @@
> > >> part_number_config_arm = {
> > >>         'march': 'armv8.4-a',
> > >>     },
> > >>     '0xd49': {
> > >> +        'march': 'armv9-a',
> > >>         'march_features': ['sve2'],
> > >> -        'compiler_options': ['-mcpu=neoverse-n2'],
> > >> +        'mcpu': 'neoverse-n2',
> > >>         'flags': [
> > >>             ['RTE_MACHINE', '"neoverse-n2"'],
> > >>             ['RTE_ARM_FEATURE_ATOMICS', true], @@ -127,21 +128,23
> > >> @@ implementer_cavium = {
> > >>     ],
> > >>     'part_number_config': {
> > >>         '0xa1': {
> > >> -            'compiler_options': ['-mcpu=thunderxt88'],
> > >> +            'mcpu': 'thunderxt88',
> > >>             'flags': flags_part_number_thunderx
> > >>         },
> > >>         '0xa2': {
> > >> -            'compiler_options': ['-mcpu=thunderxt81'],
> > >> +            'mcpu': 'thunderxt81',
> > >>             'flags': flags_part_number_thunderx
> > >>         },
> > >>         '0xa3': {
> > >> -            'compiler_options': ['-march=armv8-a+crc', '-mcpu=thunderxt83'],
> > >> +            'march': 'armv8-a',
> > >> +            'march_features': ['crc'],
> > >> +            'mcpu': 'thunderxt83',
> > >>             'flags': flags_part_number_thunderx
> > >>         },
> > >>         '0xaf': {
> > >>             'march': 'armv8.1-a',
> > >>             'march_features': ['crc', 'crypto'],
> > >> -            'compiler_options': ['-mcpu=thunderx2t99'],
> > >> +            'mcpu': 'thunderx2t99',
> > >>             'flags': [
> > >>                 ['RTE_MACHINE', '"thunderx2"'],
> > >>                 ['RTE_ARM_FEATURE_ATOMICS', true], @@ -153,7 +156,7
> > >> @@ implementer_cavium = {
> > >>         '0xb2': {
> > >>             'march': 'armv8.2-a',
> > >>             'march_features': ['crc', 'crypto', 'lse'],
> > >> -            'compiler_options': ['-mcpu=octeontx2'],
> > >> +            'mcpu': 'octeontx2',
> > >>             'flags': [
> > >>                 ['RTE_MACHINE', '"cn9k"'],
> > >>                 ['RTE_ARM_FEATURE_ATOMICS', true], @@ -176,7 +179,7
> > >> @@ implementer_ampere = {
> > >>         '0x0': {
> > >>             'march': 'armv8-a',
> > >>             'march_features': ['crc', 'crypto'],
> > >> -            'compiler_options':  ['-mtune=emag'],
> > >> +            'mcpu': 'emag',
> > >>             'flags': [
> > >>                 ['RTE_MACHINE', '"eMAG"'],
> > >>                 ['RTE_MAX_LCORE', 32], @@ -186,7 +189,7 @@
> > >> implementer_ampere = {
> > >>         '0xac3': {
> > >>             'march': 'armv8.6-a',
> > >>             'march_features': ['crc', 'crypto'],
> > >> -            'compiler_options':  ['-mcpu=ampere1'],
> > >> +            'mcpu': 'ampere1',
> > >>             'flags': [
> > >>                 ['RTE_MACHINE', '"AmpereOne"'],
> > >>                 ['RTE_MAX_LCORE', 320], @@ -206,7 +209,7 @@
> > >> implementer_hisilicon = {
> > >>         '0xd01': {
> > >>             'march': 'armv8.2-a',
> > >>             'march_features': ['crypto'],
> > >> -            'compiler_options': ['-mtune=tsv110'],
> > >> +            'mcpu': 'tsv110',
> > >>             'flags': [
> > >>                 ['RTE_MACHINE', '"Kunpeng 920"'],
> > >>                 ['RTE_ARM_FEATURE_ATOMICS', true], @@ -695,11
> > >> +698,21 @@
> > if
> > >> update_flags
> > >>
> > >>     machine_args = [] # Clear previous machine args
> > >>
> > >> +    candidate_mcpu = ''
> > >> +    if part_number_config.has_key('mcpu')
> > >> +        mcpu = part_number_config['mcpu']
> > >> +        if (cc.has_argument('-mcpu=' + mcpu))
> > >> +            candidate_mcpu = mcpu
> > >> +        endif
> > >> +    endif
> > >> +
> > >>     # probe supported archs and their features
> > >>     candidate_march = ''
> > >>     if part_number_config.has_key('march')
> > >> -        if part_number_config.get('force_march', false)
> > >> -            candidate_march = part_number_config['march']
> > >> +        if part_number_config.get('force_march', false) or
> > >> + candidate_mcpu !=
> > ''
> > >> +            if cc.has_argument('-march=' +  part_number_config['march'])
> > >> +                candidate_march = part_number_config['march']
> > >> +            endif
> > >>         else
> > >>             supported_marchs = ['armv8.6-a', 'armv8.5-a',
> > >> 'armv8.4-a',
> > 'armv8.3-
> > >> a',
> > >>                                 'armv8.2-a', 'armv8.1-a',
> > >> 'armv8-a'] @@ -717,32 +730,43 @@ if update_flags
> > >>                 endif
> > >>             endforeach
> > >>         endif
> > >> -        if candidate_march == ''
> > >> -            error('No suitable armv8 march version found.')
> > >> -        endif
> > >> +
> > >>         if candidate_march != part_number_config['march']
> > >> -            warning('Configuration march version is ' +
> > >> -                    '@0@, but the compiler supports only @1@.'
> > >> -                    .format(part_number_config['march'], candidate_march))
> > >> +            warning('Configuration march version is @0@, not supported.'
> > >> +                    .format(part_number_config['march']))
> > >> +            if candidate_march != ''
> > >> +                warning('Using march version @0@.'.format(candidate_march))
> > >> +            endif
> > >>         endif
> > >> -        candidate_march = '-march=' + candidate_march
> > >>
> > >> -        march_features = []
> > >> -        if part_number_config.has_key('march_features')
> > >> -            march_features += part_number_config['march_features']
> > >> -        endif
> > >> -        if soc_config.has_key('extra_march_features')
> > >> -            march_features += soc_config['extra_march_features']
> > >> +        if candidate_march == '' and candidate_mcpu == ''
> > >> +            error('No suitable ARM march/mcpu version found.')
> > >>         endif
> > >> -        foreach feature: march_features
> > >> -            if cc.has_argument('+'.join([candidate_march, feature]))
> > >> -                candidate_march = '+'.join([candidate_march, feature])
> > >> -            else
> > >> -                warning('The compiler does not support feature @0@'
> > >> -                    .format(feature))
> > >> +
> > >> +        if candidate_march != ''
> > >> +            candidate_march = '-march=' + candidate_march
> > >> +            march_features = []
> > >> +            if part_number_config.has_key('march_features')
> > >> +                march_features +=
> > >> + part_number_config['march_features']
> > >>             endif
> > >> -        endforeach
> > >> -        machine_args += candidate_march
> > >> +            if soc_config.has_key('extra_march_features')
> > >> +                march_features += soc_config['extra_march_features']
> > >> +            endif
> > >> +            foreach feature: march_features
> > >> +                if cc.has_argument('+'.join([candidate_march, feature]))
> > >> +                    candidate_march = '+'.join([candidate_march, feature])
> > >> +                else
> > >> +                    warning('The compiler does not support feature @0@'
> > >> +                        .format(feature))
> > >> +                endif
> > >> +            endforeach
> > >> +            machine_args += candidate_march
> > >> +        endif
> > >> +    endif
> > >> +
> > >> +    if candidate_mcpu != ''
> > >> +        candidate_mcpu = '-mcpu=' + candidate_mcpu
> > >> +        machine_args += candidate_mcpu
> > >>     endif
> > >>
> > >>     # apply supported compiler options
> > >> --
> > >> 2.43.0
> > >


  reply	other threads:[~2024-02-07  0:01 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-21  9:36 [PATCH 1/2] " pbhagavatula
2024-01-21  9:36 ` [PATCH 2/2] config/arm: add support for fallback march pbhagavatula
2024-01-22  6:30   ` Ruifeng Wang
2024-01-22 11:04   ` Juraj Linkeš
2024-01-22 12:16     ` [EXT] " Pavan Nikhilesh Bhagavatula
2024-01-22 16:29       ` Juraj Linkeš
2024-01-24 15:25         ` Pavan Nikhilesh Bhagavatula
2024-01-22  6:29 ` [PATCH 1/2] config/arm: avoid mcpu and march conflicts Ruifeng Wang
2024-01-22 10:55 ` Juraj Linkeš
2024-01-22 11:54   ` [EXT] " Pavan Nikhilesh Bhagavatula
2024-01-22 16:26     ` Juraj Linkeš
2024-01-24 15:21       ` Pavan Nikhilesh Bhagavatula
2024-01-29  8:44         ` Juraj Linkeš
2024-01-30 16:16           ` Pavan Nikhilesh Bhagavatula
2024-01-31  9:03             ` Juraj Linkeš
2024-02-01 21:57 ` [PATCH v2 1/3] " pbhagavatula
2024-02-01 21:57   ` [PATCH v2 2/3] config/arm: add support for fallback march pbhagavatula
2024-02-01 21:57   ` [PATCH v2 3/3] config/arm: allow WFE to be enabled config time pbhagavatula
2024-02-07  2:55     ` Honnappa Nagarahalli
2024-02-10  6:47       ` Pavan Nikhilesh Bhagavatula
2024-02-10 16:36         ` Honnappa Nagarahalli
2024-02-10 16:40           ` Pavan Nikhilesh Bhagavatula
2024-02-02  8:50   ` [PATCH v3 1/3] config/arm: avoid mcpu and march conflicts pbhagavatula
2024-02-02  8:50     ` [PATCH v3 2/3] config/arm: add support for fallback march pbhagavatula
2024-02-07 20:24       ` Wathsala Wathawana Vithanage
2024-02-02  8:50     ` [PATCH v3 3/3] config/arm: allow WFE to be enabled config time pbhagavatula
2024-02-10 16:56       ` Honnappa Nagarahalli
2024-02-12 19:21       ` Wathsala Wathawana Vithanage
2024-02-06  4:10     ` [PATCH v3 1/3] config/arm: avoid mcpu and march conflicts Wathsala Wathawana Vithanage
2024-02-06  4:44       ` Honnappa Nagarahalli
2024-02-06 10:21         ` Pavan Nikhilesh Bhagavatula
2024-02-07  0:01           ` Wathsala Wathawana Vithanage [this message]
2024-02-10  6:49             ` Pavan Nikhilesh Bhagavatula
2024-02-10 15:20               ` Honnappa Nagarahalli
2024-02-10 17:21                 ` Honnappa Nagarahalli
2024-02-21 20:20     ` [PATCH v4 " pbhagavatula
2024-02-21 20:20       ` [PATCH v4 2/3] config/arm: add support for fallback march pbhagavatula
2024-02-22 10:47         ` Juraj Linkeš
2024-02-22 12:32           ` [EXT] " Pavan Nikhilesh Bhagavatula
2024-02-21 20:20       ` [PATCH v4 3/3] config/arm: allow WFE to be enabled config time pbhagavatula
2024-02-22  9:37       ` [PATCH v4 1/3] config/arm: avoid mcpu and march conflicts Juraj Linkeš
2024-02-22  9:49         ` [EXT] " Pavan Nikhilesh Bhagavatula
2024-02-22 12:45       ` [PATCH v5 " pbhagavatula
2024-02-22 12:45         ` [PATCH v5 2/3] config/arm: add support for fallback march pbhagavatula
2024-02-23 11:49           ` Juraj Linkeš
2024-02-26  7:11             ` [EXT] " Pavan Nikhilesh Bhagavatula
2024-02-26  7:31               ` Juraj Linkeš
2024-02-26  7:34                 ` Juraj Linkeš
2024-02-22 12:45         ` [PATCH v5 3/3] config/arm: allow WFE to be enabled config time pbhagavatula
2024-02-23 11:19         ` [PATCH v5 1/3] config/arm: avoid mcpu and march conflicts Juraj Linkeš
2024-02-26  7:08           ` [EXT] " Pavan Nikhilesh Bhagavatula
2024-02-26  7:38         ` [PATCH v6 " pbhagavatula
2024-02-26  7:38           ` [PATCH v6 2/3] config/arm: add support for fallback march pbhagavatula
2024-02-26  7:38           ` [PATCH v6 3/3] config/arm: allow WFE to be enabled config time pbhagavatula
2024-03-06 15:49           ` [PATCH v7 1/3] config/arm: avoid mcpu and march conflicts pbhagavatula
2024-03-06 15:49             ` [PATCH v7 2/3] config/arm: add support for fallback march pbhagavatula
2024-03-06 15:49             ` [PATCH v7 3/3] config/arm: allow WFE to be enabled config time pbhagavatula
2024-03-07  3:57             ` [PATCH v7 1/3] config/arm: avoid mcpu and march conflicts Pavan Nikhilesh Bhagavatula
2024-03-14 11:38             ` [PATCH v8 1/5] " pbhagavatula
2024-03-14 11:38               ` [PATCH v8 2/5] config/arm: add armv9-a march support pbhagavatula
2024-03-14 11:38               ` [PATCH v8 3/5] config/arm: add crypto march feature to thunderxt83 pbhagavatula
2024-03-14 12:00                 ` Jerin Jacob
2024-03-14 11:38               ` [PATCH v8 4/5] config/arm: add support for fallback march pbhagavatula
2024-03-14 11:38               ` [PATCH v8 5/5] config/arm: allow WFE to be enabled config time pbhagavatula
2024-03-15 11:17               ` [PATCH v8 1/5] config/arm: avoid mcpu and march conflicts Thomas Monjalon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=AM0PR08MB507331597463150A118A0E049F452@AM0PR08MB5073.eurprd08.prod.outlook.com \
    --to=wathsala.vithanage@arm.com \
    --cc=Honnappa.Nagarahalli@arm.com \
    --cc=bruce.richardson@intel.com \
    --cc=dev@dpdk.org \
    --cc=jerinj@marvell.com \
    --cc=juraj.linkes@pantheon.tech \
    --cc=nd@arm.com \
    --cc=pbhagavatula@marvell.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).