On Wed, Dec 11, 2013 at 12:02 AM, Maxim Kuvyrkov <ma...@kugelworks.com> wrote:
> On 11/12/2013, at 11:14 am, Ramana Radhakrishnan <ramana....@googlemail.com> 
> wrote:
>
>> On Tue, Dec 10, 2013 at 9:44 PM, Maxim Kuvyrkov <ma...@kugelworks.com> wrote:
>>> On 11/12/2013, at 5:17 am, Ramana Radhakrishnan <ramana....@googlemail.com> 
>>> wrote:
>>>
>>>> On Mon, Jul 1, 2013 at 5:31 PM, Paulo Matos <pma...@broadcom.com> wrote:
>>>>> Hi,
>>>>>
>>>>> Near the start of schedule_block, find_modifiable_mems is called if 
>>>>> DONT_BREAK_DEPENDENCIES is not enabled for this scheduling pass. It seems 
>>>>> on c6x backend currently uses this.
>>>>> However, it's quite strange that this is not a requirement for all 
>>>>> backends since find_modifiable_mems, moves all my dependencies in 
>>>>> SD_LIST_HARD_BACK to SD_LIST_SPEC_BACK even though I don't have 
>>>>> DO_SPECULATION enabled.
>>>>>
>>>>> Since dependencies are accessed later on from try_ready (for example), I 
>>>>> would have thought that it would be always good not to call 
>>>>> find_modifiable_mems,  given that it seems to 'literally' break 
>>>>> dependencies.
>>>>>
>>>>> Is the behaviour of find_modifiable_mems a bug or somehow expected?
>>>
>>> "Breaking" a dependency in scheduler involves modification of instructions 
>>> that would allow scheduler to move one instruction past the other.  The 
>>> most common case of breaking a dependency is "r2 = r1 + 4; r3 = [r2];" 
>>> which can be transformed into "r3 = [r1 + 4]; r2 = r1 + 4;".  Breaking a 
>>> dependency is not ignoring it, speculatively or otherwise; it is an 
>>> equivalent code transformation to allow scheduler more freedom to fill up 
>>> CPU cycles.
>>
>>
>> Yes, but there are times when it does this a bit too aggressively and
>> this looks like the cause for a performance regression that I'm
>> investigating on ARM. I was looking for a way of preventing this
>> transformation and there doesn't seem to be an easy one other than the
>> obvious hack.
>
> If you want a particular transformation from occurring, then you need to 
> investigate why scheduler thinks that there is nothing better to do than to 
> schedule an instruction which requires breaking a dependency.  "Breaking" a 
> dependency only increases pool of instructions available to schedule, and 
> your problem seems to be laying in "why" the wrong instruction is selected 
> from that pool.
>
> Are you sure that the problem is introduced by dependency breaking, rather 
> than dependency breaking exposing a latent bug?

From my reading because the dependency breaking is of addresses that
are in a memcpy type loop which is unrolled and the original
expectation is that by switching this to an add and a negative offset
one can get more ILP in theory, but in practice the effects appear to
be worse because of secondary issues that I'm still investigating.

>
>>
>> Additionally there appears to be no way to control "flags" in a
>> backend hook for sched-rgn for DONT_BREAK_DEPENDENCIES . Again if the
>> DONT_BREAK_DEPENDENCIES is meant to be disabled with these flags, then
>> it looks like we should allow for these to also be handled or describe
>> TARGET_SCHED_SET_SCHED_FLAGS as only a hook valid with the selective
>> scheduler.
>
> I'm not sure I follow you here.  Any port can define 
> TARGET_SCHED_SET_SCHED_FLAGS and set current_sched_info->flags to whatever it 
> thinks is appropriate.  E.g., c6x does this to disable dependency breaking 
> for a particular kind of loops.

Ah, that will probably work and that's probably what I was missing. I
don't like the idea in general of the same interface setting global
state randomly in a backend is probably not the best approach in the
long term. Expecting to set global state in this form from an
interface is something I wasn't expecting especially when it takes a
parameter.

Thanks for the emails and the clarifications - useful enough for me to
try something in the morning.

regards
Ramana

>
>>
>>>
>>>>
>>>>
>>>> It's funny how I've been trying to track down a glitch and ended up
>>>> asking the same question today. Additionally if I use
>>>> TARGET_SCHED_SET_SCHED_FLAGS on a port that doesn't use the selective
>>>> scheduler, this does nothing. Does anyone know why is this the default
>>>> for ports where we don't turn on selective scheduling and might need a
>>>> hook to turn this off ?
>>>
>>> SCHED_FLAGS is used to enable or disable various parts of GCC scheduler.  
>>> On an architecture that supports speculative >scheduling with recovery 
>>> (IA64) it can turn this feature on or off.  The documentation for various 
>>> features of sched-rgn, sched-ebb and sel-sched is not the best and one will 
>>> likely get weird artefacts by trying out non-default settings.
>>
>>
>> Well, it appears as though TARGET_SCHED_SET_SCHED_FLAGS is only valid
>> with the selective scheduler on as above and is a no-op as far as
>> sched-rgn goes. This whole area could do with some improved
>> documentation - I'll follow up with some patches to see if I can
>> improve the situation.
>
> I don't think this is the case.  TARGET_SCHED_SET_SCHED_FLAGS has two 
> outputs: one is SPEC_INFO structure (which is used for IA64 only, both for 
> sel-sched and sched-rgn), and the other one is modification of 
> current_sched_info->flags, which affects all schedulers (sched-rgn, sched-ebb 
> and sel-sched) and all ports.
>
> --
> Maxim Kuvyrkov
> www.kugelworks.com
>
>
>
>

Reply via email to