public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: Changbin Du <changbin.du@huawei.com>
To: Richard Biener <richard.guenther@gmail.com>
Cc: Changbin Du <changbin.du@huawei.com>,
Jan Hubicka <hubicka@ucw.cz>, <gcc@gcc.gnu.org>,
<gcc-bugs@gcc.gnu.org>, Ning Jia <ning.jia@huawei.com>,
Li Yu <marvin.tms@huawei.com>, Wang Nan <wangnan0@huawei.com>,
Hui Wang <hw.huiwang@huawei.com>
Subject: Re: [Predicated Ins vs Branches] O3 and PGO result in 2x performance drop relative to O2
Date: Tue, 1 Aug 2023 20:21:14 +0800 [thread overview]
Message-ID: <20230801122114.4tyrwi7kemukya73@M910t> (raw)
In-Reply-To: <CAFiYyc2TtaSZtcmY0XjYzxMubNMSuuqvTHS_OzKTLc_M8Mg=Aw@mail.gmail.com>
On Mon, Jul 31, 2023 at 03:53:26PM +0200, Richard Biener wrote:
[snip]
> > The main difference in the compilation output about code around the miss-prediction
> > branch is:
> > o In O2: predicated instruction (cmov here) is selected to eliminate above
> > branch. cmov is true better than branch here.
> > o In O3/PGO: bitout() is inlined into encode_file(), and branch instruction
> > is selected. But this branch is obviously *unpredictable* and the compiler
> > doesn't know it. This why O3/PGO are are so bad for this program.
> >
> > Gcc doesn't support __builtin_unpredictable() which has been introduced by llvm.
> > Then I tried to see if __builtin_expect_with_probability(e,x, 0.5) can serve the
> > same purpose. The result is negative.
>
> But does it appear to be predictable with your profiling data?
>
I profiled the branch-misses event on a kabylake machine. 99% of the
mis-prediction blames to encode_file() function.
$ sudo perf record -e branch-instructions:pp,branch-misses:pp -c 1000 -- taskset -c 0 ./huffman.O3 test.data
Samples: 197K of event 'branch-misses:pp', Event count (approx.): 197618000
Overhead Command Shared Object Symbol
99.58% huffman.O3 huffman.O3 [.] encode_file
0.12% huffman.O3 [kernel.vmlinux] [k] __x86_indirect_thunk_array
0.11% huffman.O3 libc-2.31.so [.] _IO_getc
0.01% huffman.O3 [kernel.vmlinux] [k] common_file_perm
Then annotate encode_file() function:
Samples: 197K of event 'branch-misses:pp', 1000 Hz, Event count (approx.): 197618000
encode_file /work/myWork/linux/pgo/huffman.O3 [Percent: local period]
Percent│ ↑ je 38
│ bitout():
│ current_byte <<= 1;
│ 70: add %edi,%edi
│ if (b == '1') current_byte |= 1;
48.70 │ ┌──cmp $0x31,%dl
47.11 │ ├──jne 7a
│ │ or $0x1,%edi
│ │nbits++;
│ 7a:└─→inc %eax
│ if (b == '1') current_byte |= 1;
│ mov %edi,current_byte
│ nbits++;
│ mov %eax,nbits
│ if (nbits == 8) {
1.16 │ cmp $0x8,%eax
3.03 │ ↓ je a0
│ encode_file():
│ for (s=codes[ch]; *s; s++) bitout (outfile, *s);
│ movzbl 0x1(%r13),%edx
│ inc %r13
│ test %dl,%dl
│ ↑ jne 70
│ ↑ jmp 38
│ nop
--
Cheers,
Changbin Du
next prev parent reply other threads:[~2023-08-01 12:21 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-31 12:55 Changbin Du
2023-07-31 13:53 ` Richard Biener
2023-08-01 8:44 ` Jan Hubicka
2023-08-01 12:31 ` Changbin Du
2023-08-01 12:21 ` Changbin Du [this message]
2023-08-01 12:45 ` Changbin Du
2023-08-11 13:37 ` Changbin Du
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=20230801122114.4tyrwi7kemukya73@M910t \
--to=changbin.du@huawei.com \
--cc=gcc-bugs@gcc.gnu.org \
--cc=gcc@gcc.gnu.org \
--cc=hubicka@ucw.cz \
--cc=hw.huiwang@huawei.com \
--cc=marvin.tms@huawei.com \
--cc=ning.jia@huawei.com \
--cc=richard.guenther@gmail.com \
--cc=wangnan0@huawei.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 read-only IMAP folder(s) and NNTP newsgroup(s).