[Vm-dev] Integer comparition primitive failures on Cog

Igor Stasenko siguctua at gmail.com
Wed May 4 00:41:50 UTC 2011


Wow.. that's cool. I had no time to get so deep into Cog JIT internals.
And it is really interesting to hear your feedback about it (to Eliot
as well, i assume) :)

On 3 May 2011 22:05, Nicolas Cellier <nicolas.cellier.aka.nice at gmail.com> wrote:
>
> OK, easy, I had a reference to ClassReg instead of Arg0Reg (copy/paste
> error from super).
> My feeling is that it is very uncomfortable to program this part...
> Since we mapped our local variables and arguments to an equivalent of
> global variables (registers Arg0Reg etc),
> then no compiler will tell us that this register is used before
> assigned or never used or what...
> Far, far away from Smalltalk safe lands...
>
> Here is a new try attached:
>
> [1 to: 2000000 do: [:i |
>   i < 2354.234.
>   i <= 2354.234.
>   i >= 2354.234.
>    i > 2354.234.]] timeToRun 71
>
> A bit slower than SimpleCogit ?
>
> Nicolas
>
> 2011/5/3 Nicolas Cellier <nicolas.cellier.aka.nice at gmail.com>:
>> OK, with SimpleCogit:
>> [1 to: 2000000 do: [:i |
>>   i < 2354.234.
>>   i <= 2354.234.
>>   i >= 2354.234.
>>    i > 2354.234.]] timeToRun 69
>>
>> vs 4.2.5 VM:
>> [1 to: 2000000 do: [:i |
>>   i < 2354.234.
>>   i <= 2354.234.
>>   i >= 2354.234.
>>    i > 2354.234.]] timeToRun 299
>>
>> StackToRegisterMappingCogit:
>> crash...
>>
>> I don't get the x86 certification yet :(
>>
>> Nicolas
>>
>>
>> 2011/5/3 Nicolas Cellier <nicolas.cellier.aka.nice at gmail.com>:
>>> Apart another declaration bug (FP missing in function name...) there
>>> is a killer :
>>>
>>> StackToRegisterMappingCogit inherits silently from
>>> SimpleStackBasedCogit>>#genSmallIntegerComparison:orDoubleComparison:
>>> though it does not share the stack structure. This is fatal...
>>>
>>> So an override StackToRegisterMappingCogit>>#genSmallIntegerComparison:orDoubleComparison:
>>> is mandatory
>>>
>>> Bad, bad inheritance...
>>>
>>> Now compiling the VM again...
>>>
>>> Nicolas
>>>
>>>
>>> 2011/5/3 Nicolas Cellier <nicolas.cellier.aka.nice at gmail.com>:
>>>> Hem, some declaration were missing... and the argument for FP
>>>> comparison is tricky indeed...
>>>> Sorry for the noise, but this is a direct live
>>>>
>>>> Nicolas
>>>>
>>>> 2011/5/3 Nicolas Cellier <nicolas.cellier.aka.nice at gmail.com>:
>>>>> And if  genSmallIntegerComparison:orDoubleComparison: is correct, then
>>>>> usage shall be quite straight forward
>>>>>
>>>>> Nicolas
>>>>>
>>>>> 2011/5/3 Nicolas Cellier <nicolas.cellier.aka.nice at gmail.com>:
>>>>>> I always refused to learn x86 assembler, but by code imitation I can
>>>>>> give my own try in attachment.
>>>>>> Note that I did not use the trick to invert FP comparison operands
>>>>>> since this does not seem necessary.
>>>>>>
>>>>>> Nicolas
>>>>>>
>>>>>>
>>>>>> 2011/5/2 Eliot Miranda <eliot.miranda at gmail.com>:
>>>>>>>
>>>>>>> Hi Henrik,
>>>>>>>
>>>>>>> Eliot (phone)
>>>>>>>
>>>>>>> On May 2, 2011, at 3:12 AM, Henrik Sperre Johansen <henrik.s.johansen at veloxit.no> wrote:
>>>>>>>
>>>>>>>> As per my comment on the recent Morphic performance graphs,(http://blog.openinworld.com/2011/03/morphic-flavour-performance/#comment-59) on a Cog VM these primitives fail with a Float parameter, which leads to a huge performance hit when comparing Ints to Floats by doing silly things in the fallback code.
>>>>>>>>
>>>>>>>> Cog:
>>>>>>>> [1 to: 2000000 do: [:i |
>>>>>>>>    i < 2354.234.
>>>>>>>>    i <= 2354.234.
>>>>>>>>    i >= 2354.234.
>>>>>>>>     i > 2354.234.]] timeToRun 26594
>>>>>>>>
>>>>>>>> Trunk:
>>>>>>>> [1 to: 2000000 do: [:i |
>>>>>>>>    i < 2354.234.
>>>>>>>>    i <= 2354.234.
>>>>>>>>    i >= 2354.234.
>>>>>>>>     i > 2354.234.]] timeToRun 229
>>>>>>>>
>>>>>>>> Should this be changed in the VM,
>>>>>>>
>>>>>>> I think so.  When I first wrote the SmallInteger translated prims I hadn't yet written the JIT support for floats and so couldn't write int/float comparison.  Now all the support is there and it should be straight-forward.  Do you fancy trying to write this yourself?  Would be a fun exercise.  Let me know and I can hand-hold with using the simulator.
>>>>>>>
>>>>>>>
>>>>>>> Best
>>>>>>> Eliot (phone)
>>>>>>>
>>>>>>>
>>>>>>>> or is the difference for pure int/int comparition large enough that we should instead change
>>>>>>>> Float>>adaptToInteger: andCompare:
>>>>>>>> to use the corresponding comparitions with Float as receiver, which does work?
>>>>>>>> That's still slower than trunk in my image, but quite a bit better, above test takes about 1s.
>>>>>>>>
>>>>>>>> Cheers,
>>>>>>>> Henry
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
>



-- 
Best regards,
Igor Stasenko AKA sig.


More information about the Vm-dev mailing list