Math trig intrinsics and compiler options

Christian Thalinger Christian.Thalinger at Sun.COM
Thu Jul 16 04:26:47 PDT 2009


Joseph D. Darcy wrote:
> Christian Thalinger wrote:
>> gustav trede wrote:
>>   
>>> Hello,
>>>
>>> Azeem Jiva told me an easy way to improve trig performance.
>>> Changing the intrinsics to use an existing but faster path gives me a
>>> boost of roughly 40% for the Math cos and sin on solaris x64.
>>>
>>>
>>> library_call.cpp
>>>
>>> bool LibraryCallKit::inline_math_
>>> native(vmIntrinsics::ID id) {
>>>   switch (id) {
>>>
>>>    case vmIntrinsics::_dcos: return Matcher::has_match_rule(Op_CosD) ?
>>> runtime_math(OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address,
>>> SharedRuntime::dcos), "COS") : false;
>>>    case vmIntrinsics::_dsin: return Matcher::has_match_rule(Op_SinD) ?
>>> runtime_math(OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address,
>>> SharedRuntime::dsin), "SIN") : false;
>>>    case vmIntrinsics::_dtan: return Matcher::has_match_rule(Op_TanD) ?
>>> runtime_math(OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address,
>>> SharedRuntime::dtan), "TAN") : false;
>>>    case vmIntrinsics::_dlog:   return Matcher::has_match_rule(Op_LogD) ?
>>> runtime_math(OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address,
>>> SharedRuntime::dlog), "LOG") : false;
>>>    case vmIntrinsics::_dlog10: return Matcher::has_match_rule(Op_Log10D)
>>> ? runtime_math(OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address,
>>> SharedRuntime::dlog10), "LOG10") : false;
>>>
>>>
>>> Is there any potential problem with such a patch  ?
>>>     
>> I'm not sure I understand this "patch".  Why should the code above be
>> faster than the current code in HotSpot, which tries to inline the
>> trigonometric functions?  Maybe the speedup you're seeing is because of
>> the missing fast/slow path check and you are always using the slow path
>> because of rounding?  Just a guess...
>>   
> 
> Hello.
> 
> Can you explain the nature of the selection difference?

It seems all boils down to:

    // Check: If PI/4 < abs(arg) then go slow

As also explained in CR 4345903:

The solution is to have the Math.{sin, cos} do their own argument
reduction to [-pi/4, pi/4] and then call fsin/fcos; this will
guarantee the specified accuracy and monotonicity properties.

> 
> Better semantics are provided if the instrinsified versions of sin, cos, 
> etc. are always used to implement the java.lang.Math flavor of those 
> methods.

-- Christian



More information about the hotspot-dev mailing list