[ GSoC ] Bit Iterators, trivial relocatability, and performance
Jonathan Wakely
jwakely@redhat.com
Mon Feb 4 13:17:00 GMT 2019
On 04/02/19 11:59 +0100, Marc Glisse wrote:
>On Mon, 4 Feb 2019, JeanHeyd Meneide wrote:
>
>>Dear libstdc++-dev Community,
>>
>> I hope this e-mail finds you all doing well. My name is JeanHeyd
>>Meneide and I am interested in participating in the Google Summer of Code,
>>2019.
>>
>> I have put together a preliminary proposal for working on
>>_Bit_iterator and overloading several standard algorithms to improve their
>>performance characteristics, following the wisdom of the 7 year old Howard
>>Hinnant writeup on vector<bool> (
>>https://howardhinnant.github.io/onvectorbool.html). I also want to look
>>into algorithmic performance improvements related to
>>is_trivially_relocatable. The proposal can be found at:
>>https://github.com/ThePhD/gsoc-2019-bit/blob/master/proposal/gsoc-2019.pdf
>>
>> I know the student application section for GSoC isn't open yet, but I
>>wanted to gain early feedback on this and was advised by people to post
>>here. (If this is the wrong place, I can post it elsewhere, such as the
>>typical gcc-dev list?)
Hi JeanHeyd, this is definitely the right place, thanks for the email
and your interest in contributing to libstdc++!
>I am not available enough during the summer to co-mentor, but the
>topic is interesting and if you post to this list I'll likely be able
>to help sometimes.
I would be willing to co-mentor, if somebody else is as well. It's
possible I could be the sole mentor, but I am always desperately short
of time just for existing work, and I might not do a good job as
mentor by myself.
>Some comments:
>
>2§1 it is good to test against preexisting tests, but it wouldn't hurt
>to add some new ones. The pitfalls will not be exactly the same, and
>while the existing tests are fine for a naive implementation, they may
>not include large consecutive groups of false (where some intrinsics
>have undefined behavior), etc.
Absolutely agreed. We have the following tests:
testsuite/25_algorithms/stable_sort/3.cc
testsuite/25_algorithms/adjacent_find/vectorbool.cc
testsuite/25_algorithms/find/vectorbool.cc
testsuite/25_algorithms/is_permutation/vectorbool.cc
testsuite/25_algorithms/heap/vectorbool.cc
testsuite/25_algorithms/find_end/vectorbool.cc
testsuite/25_algorithms/find_if_not/vectorbool.cc
testsuite/25_algorithms/iter_swap/20577.cc
testsuite/25_algorithms/find_first_of/vectorbool.cc
testsuite/25_algorithms/find_if/vectorbool.cc
testsuite/25_algorithms/sort/vectorbool.cc
But they all work on tiny data sets (usually fewer than 8 bits) so
won't hit any edge cases likely to matter with smarter
implementations. Naïve tests are OK for a naïve implementation, but a
smarter implementation will need more tests.
>I never tried to run the llvm checks on
>libstdc++, but trying it once (without spending weeks on it if it is
>hard) could be a nice sanity check.
Running the libc++ tests is trivial, you just need a lit.site.cfg like
the one attached, to tell the test harness to use g++.
>2§3 code review really happens on the list, bugzilla is for reporting bugs
Yup.
>2.2 it isn't clear what you would optimize about iter_move/iter_swap,
>which handle a single bit. If there is work to be done here, it is
>more likely in the optimizers.
>
>3 Don't oversell Arthur's proposal. It was one amongst several that
>appeared along the years, and it doesn't seem to have been received
>much better (i.e. people are interested but it isn't clear the
>approach is the one we want).
Agreed.
I think an implementation of P0237 might be more valuable than the
trivially-relocatable topic (and closer to the vector<bool> part of
the proposal).
N.B. as I think Ville mentioned previously, we do have a
dynamic_bitset in libstdc++. <tr2/dynamic_bitset> is an implementation
of N2050, but has only been minimally maintained since it was added.
There are no specialized algorithms for it, so there is definitely
room for improvement.
>The remark above about optimizers is one I think is interesting when
>contributing to a compiler, although others may find it less relevant:
>it is good to tweak the library to improve performance, but when
>possible it is even better to tweak the optimizers to generate the
>same good asm from the old readable code. The second is often harder
>or even impossible, so it is worth doing the first, but it should be
>kept in mind when you see a low hanging fruit. And for this, it may be
>good to take a look at what the compiler (with -O2 or -O3) writes with
>-fdump-tree-optimized. It is good anyway because you will have a
>clearer picture of what your code does, you will notice if popcount is
>surrounded by tons of tests or in a tight loop, etc.
Yes, if research done for such a GSoC project results in
"missed-optimization" bug reports for the compiler, so that the
optimizers can improve, then that's a good outcome too. Source-level
optimizations in the library code do not have to be the only goal.
-------------- next part --------------
# This file belogs in libcxx/test/lit.site.cfg
# Configure the testsuite for libstdc++.
config.cxx_stdlib_under_test = 'libstdc++'
local_gcc_path = "/home/jwakely/gcc/latest"
# The compiler used to test. Set this to your prefered default. You
# can use --param=cxx_under_test=<comp> to override it on the command line.
config.cxx_under_test = "%s/bin/g++" % local_gcc_path
# The directory containing libstdc++.so. This will add '-L<path>'
# and '-rpath <path>'
config.cxx_library_root = "%s/lib64" % local_gcc_path
# Enable/Disable testing certain features. These should be the right defaults
# for ToT libstdc++
config.enable_exceptions = "True"
config.enable_experimental = "True"
config.enable_filesystem = "True"
config.enable_rtti = "True"
config.enable_shared = "True"
config.enable_32bit = "False"
# Misc GCC configuration options
config.target_triple = ""
config.sysroot = ""
# This path will be used when generating temporary files when running the tests.
config.project_obj_root = '/tmp/libcxx-testsuite-output'
config.libcxx_obj_root = '/tmp/libcxx-testsuite-output'
# Let the main config do the real work.
import os
cfg_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lit.cfg')
config.loaded_site_config = True
lit_config.load_config(config, cfg_path)
More information about the Libstdc++
mailing list