glibc.cpu.cached_memopt (was Re: [PATCH] Rename the glibc.tune namespace to glibc.cpu)

Siddhesh Poyarekar siddhesh@sourceware.org
Mon Aug 6 11:00:00 GMT 2018


On 08/04/2018 02:03 AM, Tulio Magno Quites Machado Filho wrote:
> Maybe it isn't restricted only to powerpc:
> https://sourceware.org/ml/libc-alpha/2018-08/msg00069.html
> 
> Obviously other machine maintainers may not be interested on cached_memopt,
> but this thread helps me to explain why I was thinking cached_memopt was
> generic.

OK.

>>> Notice the optimization is not specific to a CPU, but specific to an user
>>> scenario (cacheable memory).  In other words, the optimization can't be used
>>> whenever PPC_FEATURE2_ARCH_2_07 because it could downgrade the performance when
>>> cache-inhibited memory is being used.
>>
>> Ahh OK, I got thrown off by the fact that there's a separate routine for
>> it and assumed that it is Power8-specific.  I have a different concern
>> then; a tunable is process-wide so the cached_memopt tunable essentially
>> assumes that the entire process is using cache-inhibited memory.  Is
>> that a reasonable assumption?
> 
> It's the opposite.
> When cached_memopt=1, it's assumed the process only uses cacheable memory.
> If cached_memopt=0 (default value), nothing is assumed and a safe execution
> is taken.

OK, thanks for the clarification. It doesn't change my question though; 
is there a performance loss when you do a safe execution and does it 
make sense to fix this in glibc?  I haven't formed a strong opinion 
either way for the latter yet but one thing that would be nice to ensure 
is that we don't do different things for different architectures.  There 
seems to be scope to come to a consensus across architectures for this 
and we should try to do that.

Given that Cauldron is only a month away, we could have a more detailed 
conversation on this in the glibc BoF too if necessary.

>> 1. A new relocation that overlays on top of ifuncs and allows selection
>> of routines based on specific properties.  I have had this idea for a
>> while but no time to implement it and it has much more general scope
>> than memory type; for example memory alignment could also be a factor to
>> short-cut parts of string routines at compile time itself.  It does not
>> have the runtime flexibility of a tunable but is probably far more
>> configurable.
> 
> Sounds interesting.  Where are these properties coming from?

I haven't thought this through tbh, but something like this:

- Add new relocations for each special case: R_MEMCPY_REG, 
R_MEMCPY_CACHE_INHIBITED, R_MEMCPY_ALIGN16, etc. that can be generated 
based on properties of the inputs such as volatileness, alignment, etc.

- Create separate entry points memcpy@plt and memcpy_noncached@plt for 
each relocation we end up using for that TU.

- Have the ifunc resolver take into consideration the relocation type 
when patching in the PLT.

It may be simpler to just emit different entry points (similar to the 
*_finite math functions) and separate ifunc resolvers if there is no 
overlap between ifunc implementations for these entry points.

> I don't think this option would help in this case.
> I can't correlate size to cache-inhibited memory.

Right, I had not understood where you were coming from then and assumed 
you were talking about non-temporal accesses.

Siddhesh



More information about the Libc-alpha mailing list