Re: std.math performance (SSE vs. real)

2014-07-08 Thread Don via Digitalmars-d

On Friday, 4 July 2014 at 17:05:16 UTC, Walter Bright wrote:

On 7/4/2014 3:38 AM, Don wrote:
What is the longest type supported by the native hardware? I 
don't know what

that means, and I don't think it even makes sense.


Most of the time, it is quite clear.

For example, Sparc has 128-bit quads, but they only have 
partial support.
Effectively. they are emulated. Why on earth would you want to 
use an emulated

type on some machines, but not on others?


Emulation is not native support.


I think the only difference it makes is performance. But there is 
not very much difference in performance between double-double, 
and implementations using microcode. Eg PowerPC double-doubles 
operations require fewer clock cycles than x87 operations on 286.



Perhaps the intention was the largest precision you can get 
for free, without
sacrificing speed then that's not clearly defined. On x86-32, 
that was indeed
80 bits. But on other systems it doesn't have an obvious 
answer.

On x86-64 it's not that simple. Nor on PPC or Sparc.


Yes, there is some degree of subjectivity on some platforms. I 
don't see a good reason for hamstringing the compiler dev with 
legalese for Platform X with legalese that isn't quite the 
right thing to do for X.


I agree. But I think we can achieve the same outcome while 
providing more semantic guarantees to the programmer.



I think the intention of the spec is clear, and the compiler 
implementor can be relied on to exercise good judgement.


The problem is that the developer cannot write code without 
knowing the semantics.
For example, one of the original motivations for having 80-bit 
floats on the x87 was that for many functions, they give you 
correctly-rounded results for 'double' precision. If you don't 
have 80-bit reals, then you need to use far more complicated 
algorithms.
If your code needs to work on a system with only 64 bit reals, 
then you have to do the hard work.


Something I've come to realize, was that William Kahan's work was 
done in a world before generic programming. He had constraints 
that we don't have.
Our metaprogramming system gives us great tools to get the 
highest accuracy and performance out of any processor. We can 
easily cope with the messy reality of real-world systems, we 
don't need to follow Java in pretending they are all the same. 
This is something we're good at!


A 'real' type that has system-dependent semantics is a poor-man's 
generics.
Take a look at std.math, and see all the instances of 'static if 
(real.mant_dig == '. Pretty clearly, 'real' is acting as if it 
were a template parameter.


And my experience is that any code which doesn't treat 'real' as 
a template parameter, is probably incorrect. I think we should 
acknowledge this.





Re: std.math performance (SSE vs. real)

2014-07-06 Thread bearophile via Digitalmars-d

Ola Fosheim Grøstad:

Both Delight and FeepingCreature appears to be alive. I guess 
that is a good sign.


I still like the idea of having in D something like the F# 
language directive #light that switches to a brace-less syntax:


http://msdn.microsoft.com/en-us/library/dd233199.aspx

I think at first the verbose syntax was the standard one in F#, 
but later the light one has become the standard one.


Bye,
bearophile


Re: std.math performance (SSE vs. real)

2014-07-06 Thread via Digitalmars-d

On Sunday, 6 July 2014 at 17:19:24 UTC, bearophile wrote:
I still like the idea of having in D something like the F# 
language directive #light that switches to a brace-less 
syntax:


I like compact syntax, like the reduction in clutter done with Go.

I've been thinking a lot about how to improve the assignments in 
C-like languages. Seems to me that when it comes to immutable 
values it makes sense to deal with them in a functional style. 
I.e. there is no real need to distinguish between a comparison of 
equality and a defined equality (assignment). Of course, that 
means boolean contexts have to be made explicit to avoid 
ambiguity.


IMO reducing clutter becomes really important when you use the 
language for describing content that needs to be modified and 
extended.


Re: std.math performance (SSE vs. real)

2014-07-05 Thread Russel Winder via Digitalmars-d
On Fri, 2014-07-04 at 12:48 +, via Digitalmars-d wrote:
[…]
 I pick the most stable tool for the job. Meaning I usually end up 
 with C, conservative use of C++, Python 2.7, Javascript, SQL or 
[…]

That should, of course, have read Python 3.4!

-- 
Russel.
=
Dr Russel Winder  t: +44 20 7585 2200   voip: sip:russel.win...@ekiga.net
41 Buckmaster Roadm: +44 7770 465 077   xmpp: rus...@winder.org.uk
London SW11 1EN, UK   w: www.russel.org.uk  skype: russel_winder


signature.asc
Description: This is a digitally signed message part


Re: std.math performance (SSE vs. real)

2014-07-05 Thread via Digitalmars-d
On Saturday, 5 July 2014 at 06:48:23 UTC, Russel Winder via 
Digitalmars-d wrote:


That should, of course, have read Python 3.4!


Most of my code has to run on App Engine, so I stick to whatever 
version Google use for all my Python stuff. They had Guido do 
their db-api a couple of years back so they probably stick with 
2.7 for a good reason? Sometimes stable means with known bugs 
and known work-arounds. ;)


Re: std.math performance (SSE vs. real)

2014-07-05 Thread Paolo Invernizzi via Digitalmars-d

On Friday, 4 July 2014 at 21:49:33 UTC, Ola Fosheim Grøstad wrote:

On Friday, 4 July 2014 at 21:08:27 UTC, Walter Bright wrote:

Sadly, this also implies that there are no computer languages 
you believe in. You set an impossible standard. How can you 
possibly say you prefer C++, a classic design by committee 
language?


I don't prefer it. I think it sucks, but it is the only viable 
choice if you want to create a scalable game or virtual world 
server.


Again, outside, in the real business world, reality is a little
different: take this monster, look, no C++!

http://www.robg3d.com/2014/01/why-ccp-is-still-using-python-2/
http://www.pcgamer.com/2013/06/15/eve-online/

What I loved about D, from the real beginning, was this:
pragmatism, pragmatism!

And after the love, what moved us as a company to adopt it was
Walter: He is a deeply pragmatic guy!
Pragmatism is an invaluable asset in business (btw, THAT should
be stressed in the logo/identity/redesign looong thread)

---
Paolo


Re: std.math performance (SSE vs. real)

2014-07-05 Thread via Digitalmars-d

On Saturday, 5 July 2014 at 09:39:10 UTC, Paolo Invernizzi wrote:

Again, outside, in the real business world, reality is a little
different: take this monster, look, no C++!

http://www.robg3d.com/2014/01/why-ccp-is-still-using-python-2/
http://www.pcgamer.com/2013/06/15/eve-online/


I don't play Eve, but in general the challenge in virtual worlds
is that you need to do full veracity checking on the server to
reduce cheating. You should also hide parts of the model so that
only the server knows it. Basically, you have to run the entire
sim on the server and only run parts of it on the client for
display purposes if you want to reduce cheating without
introducing draconian measures that basically takes over the
machine (which cannot work if the client runs in the browser).

Anyway, at the end of the day, for a freemium game you need to
cut server costs because you cannot estimate correctly how much
money you make per online user. With a subscription model you are
better off and can spend more on hardware.

What you can or cannot do, depends on the business model, the
market and the game design…


What I loved about D, from the real beginning, was this:
pragmatism, pragmatism!


I am pragmatic about this. I have stuff planned that can run on
Python on top of Google Datastore on the server and use
Dart+WebGL on the client. But if you want a physics based model,
user building and fast travelling you have to consider the worst
case scenario and you cannot do it in Python or using a disk
based database.  You need a in-memory database and hit the
hardware so that you can take the peaks without ending up with
molasses of latency.


And after the love, what moved us as a company to adopt it was
Walter: He is a deeply pragmatic guy!
Pragmatism is an invaluable asset in business (btw, THAT should
be stressed in the logo/identity/redesign looong thread)


The most valuable factor in business is predictability,
opportunities and being better at cutting costs than the
competition. Google are pragmatic, they dump IE9 on most of their
platforms. Unfortunately for businesses using Google tech that
means loss of predictability, lost opportunities and increased
costs.

Pragmatism in the context of D is community building. Sure, being
pragmatic about the logo is important, you should encourage
people using it in different ways because it is a community
building tool (among many). Like the penguin in Linux being used
in games etc. Community building means encouraging participation
and setting direction. If you don't set direction, people will
sit on the fence waiting for something to happen. Communities
don't build skeletons, they add meat to the bones.


Re: std.math performance (SSE vs. real)

2014-07-05 Thread Paolo Invernizzi via Digitalmars-d

On Saturday, 5 July 2014 at 11:14:40 UTC, Ola Fosheim Grøstad
wrote:
On Saturday, 5 July 2014 at 09:39:10 UTC, Paolo Invernizzi 
wrote:

Again, outside, in the real business world, reality is a little
different: take this monster, look, no C++!

http://www.robg3d.com/2014/01/why-ccp-is-still-using-python-2/
http://www.pcgamer.com/2013/06/15/eve-online/


I don't play Eve, but in general the challenge in virtual worlds
is that you need to do full veracity checking on the server to
reduce cheating. You should also hide parts of the model so that
only the server knows it. Basically, you have to run the entire
sim on the server and only run parts of it on the client for
display purposes if you want to reduce cheating without
introducing draconian measures that basically takes over the
machine (which cannot work if the client runs in the browser).

Anyway, at the end of the day, for a freemium game you need to
cut server costs because you cannot estimate correctly how much
money you make per online user. With a subscription model you 
are

better off and can spend more on hardware.

What you can or cannot do, depends on the business model, the
market and the game design…


I agree, but keep this is mind: a business model is not carved in
stone, it keeps changing, as the market is not a static thing.
And this is true also in the programming language field, as the
IT universe is not a static thing.

I liked the Lang.NEXT panel, especially when Bjarne talked about
the real world pressure over C++...


What I loved about D, from the real beginning, was this:
pragmatism, pragmatism!


I am pragmatic about this. I have stuff planned that can run on
Python on top of Google Datastore on the server and use
Dart+WebGL on the client. But if you want a physics based model,
user building and fast travelling you have to consider the worst
case scenario and you cannot do it in Python or using a disk
based database.  You need a in-memory database and hit the
hardware so that you can take the peaks without ending up with
molasses of latency.


If you read carefully, EVE was not designed for the actual number
of concurrent users: they was forced to keep changing, to survive
the challenges. The worst case scenario is the today worst case
scenario.

You can't design now for what you think will be the needs in a
too much distance future, that's will put your product in the
Longhorn cemetery. Things need to be done now, to get the current
business opportunity window.


And after the love, what moved us as a company to adopt it was
Walter: He is a deeply pragmatic guy!
Pragmatism is an invaluable asset in business (btw, THAT should
be stressed in the logo/identity/redesign looong thread)


The most valuable factor in business is predictability,
opportunities and being better at cutting costs than the
competition.


Thinks are a little more complicated than that, but well, at the
end, business is all about satisfying the needs of someone else
who is free to choose among alternatives.

So, turning back into the floating point issue of the thread,
what's the most pragmatic move D can take about that floating
point performance issue?

Take the road that satisfy better the most demanded need asked
nowadays by D user base, so speed by default.
Satisfy the precision demand with real, but keep this need in an
explicit language domain corner: there's no silver bullet.

Pragmatism in the context of D is community building. Sure, 
being

pragmatic about the logo is important, you should encourage
people using it in different ways because it is a community
building tool (among many). Like the penguin in Linux being used
in games etc. Community building means encouraging participation
and setting direction. If you don't set direction, people will
sit on the fence waiting for something to happen. Communities
don't build skeletons, they add meat to the bones.


What I was meaning: a pragmatic language is a beautiful
business claim, let's stress it: it worked very well for me!

---
Paolo


Re: std.math performance (SSE vs. real)

2014-07-05 Thread via Digitalmars-d

On Saturday, 5 July 2014 at 13:16:28 UTC, Paolo Invernizzi wrote:
I agree, but keep this is mind: a business model is not carved 
in stone, it keeps changing, as the market is not a static 
thing.


Ok, but for the virtual world side I am more driven by (artistic) 
model needs than the business side. So I am looking for a 
solution that fits the requirements.



And this is true also in the programming language field, as the
IT universe is not a static thing.


No, but for contractual work I need to be able to add small 
enhancements 12 months after deployment without adding transition 
costs. So a static dev environment matters a lot. If a customer 
expect that an enhancement takes 10 hours to add, I cannot charge 
for 50 hours. So if the dev environment incurs a transition cost 
I have to accept the enhancement request at a loss.


(App Engine is pretty stable and has a 12 months guarantee, which 
is on the low side IMO. I think 24 months would be more 
appropriate.).


If you read carefully, EVE was not designed for the actual 
number of concurrent users:


I only glossed over it. I read external analyses of EVE 10 years 
ago when I studied online worlds. I believe they had some 
significant performance problems back. But the game model is not 
really low latency based.



You can't design now for what you think will be the needs in a
too much distance future, that's will put your product in the
Longhorn cemetery. Things need to be done now, to get the 
current business opportunity window.


I'm not interested in virtual worlds for the business, but for 
the art of it. So my basic ideas are 10-20 years old and 
basically just waiting for the technology to catch up. ;^)


If I have to nudge the tech to make the last mile, ok, then I 
might have to do so…



So, turning back into the floating point issue of the thread,
what's the most pragmatic move D can take about that floating
point performance issue?


Provide the tools to specify the constraints, like you do for 
nogc/safe, but with version support.


But I think D should be specified, not by the implementation, but 
in a paper. And I think the language should be cleaned up a bit, 
on paper, without thinking about the implementation cost for a 
specific compiler. Because if the resulting language is a true 
beauty, then more hands will come to add meat to the bones.


I'm not complaining about requiring strict IEEE 754 compliance, I 
am complaining about requiring it and then saying that it does 
not matter what the compiler devs do. Because it is obvious that 
on many platforms you don't get full compliance for special cases 
without some kind of software emulation/handling.



What I was meaning: a pragmatic language is a beautiful
business claim, let's stress it: it worked very well for me!


Python is a very pragmatic language, I don't like the dynamic 
aspects, but it is one of the most pragmatic languages out there.


The way I see it now, the most pragmatic solution would be to 
fork D, clean up the syntax a bit and make it work well for the 
domain of game servers. I don't need the libraries. Only UDP/TCP. 
Whether that is cost efficient compared to just using C++, I 
dunno. But the more I follow the discussions on the D forums, the 
more I feel that forking will be more productive than spending 
effort on affecting the current direction (which most probably 
will not get me what I want).


Re: std.math performance (SSE vs. real)

2014-07-05 Thread Iain Buclaw via Digitalmars-d
On 5 July 2014 15:20, via Digitalmars-d digitalmars-d@puremagic.com wrote:
 On Saturday, 5 July 2014 at 13:16:28 UTC, Paolo Invernizzi wrote:

 I agree, but keep this is mind: a business model is not carved in stone,
 it keeps changing, as the market is not a static thing.


 Ok, but for the virtual world side I am more driven by (artistic) model
 needs than the business side. So I am looking for a solution that fits the
 requirements.


 And this is true also in the programming language field, as the
 IT universe is not a static thing.


 No, but for contractual work I need to be able to add small enhancements 12
 months after deployment without adding transition costs. So a static dev
 environment matters a lot. If a customer expect that an enhancement takes 10
 hours to add, I cannot charge for 50 hours. So if the dev environment incurs
 a transition cost I have to accept the enhancement request at a loss.

 (App Engine is pretty stable and has a 12 months guarantee, which is on the
 low side IMO. I think 24 months would be more appropriate.).


 If you read carefully, EVE was not designed for the actual number of
 concurrent users:


 I only glossed over it. I read external analyses of EVE 10 years ago when I
 studied online worlds. I believe they had some significant performance
 problems back. But the game model is not really low latency based.


 You can't design now for what you think will be the needs in a
 too much distance future, that's will put your product in the
 Longhorn cemetery. Things need to be done now, to get the current business
 opportunity window.


 I'm not interested in virtual worlds for the business, but for the art of
 it. So my basic ideas are 10-20 years old and basically just waiting for the
 technology to catch up. ;^)

 If I have to nudge the tech to make the last mile, ok, then I might have to
 do so…


 So, turning back into the floating point issue of the thread,
 what's the most pragmatic move D can take about that floating
 point performance issue?


 Provide the tools to specify the constraints, like you do for nogc/safe, but
 with version support.

 But I think D should be specified, not by the implementation, but in a
 paper. And I think the language should be cleaned up a bit, on paper,
 without thinking about the implementation cost for a specific compiler.
 Because if the resulting language is a true beauty, then more hands will
 come to add meat to the bones.

 I'm not complaining about requiring strict IEEE 754 compliance, I am
 complaining about requiring it and then saying that it does not matter what
 the compiler devs do. Because it is obvious that on many platforms you don't
 get full compliance for special cases without some kind of software
 emulation/handling.


This is a library problem, not a language problem.  In this case
std.math uses real everywhere when perhaps it shouldn't.


 What I was meaning: a pragmatic language is a beautiful
 business claim, let's stress it: it worked very well for me!


 Python is a very pragmatic language, I don't like the dynamic aspects, but
 it is one of the most pragmatic languages out there.


http://pyd.dsource.org


 The way I see it now, the most pragmatic solution would be to fork D, clean
 up the syntax a bit and make it work well for the domain of game servers. I
 don't need the libraries. Only UDP/TCP. Whether that is cost efficient
 compared to just using C++, I dunno. But the more I follow the discussions
 on the D forums, the more I feel that forking will be more productive than
 spending effort on affecting the current direction (which most probably will
 not get me what I want).

You mean, MiniD?  Someone has already done that, years ago

http://jfbillingsley.com/croc/wiki/Lang/GettingStarted



Re: std.math performance (SSE vs. real)

2014-07-05 Thread via Digitalmars-d
On Saturday, 5 July 2014 at 15:09:28 UTC, Iain Buclaw via 
Digitalmars-d wrote:

This is a library problem, not a language problem.  In this case
std.math uses real everywhere when perhaps it shouldn't.


If x/y leads to a division by zero trap when it should not, then 
it isn't a library problem.



You mean, MiniD?  Someone has already done that, years ago


No, I meant forking D.


Re: std.math performance (SSE vs. real)

2014-07-05 Thread bearophile via Digitalmars-d

Ola Fosheim Grøstad:


No, I meant forking D.


There is already Delight and FeepingCreature has created a D-like 
language. If you fork D you will have lot of fun :-) Keep us 
updated.


Bye,
bearophile


Re: std.math performance (SSE vs. real)

2014-07-05 Thread via Digitalmars-d

On Saturday, 5 July 2014 at 15:28:00 UTC, bearophile wrote:
There is already Delight and FeepingCreature has created a 
D-like language. If you fork D you will have lot of fun :-)


Thanks :)

Both Delight and FeepingCreature appears to be alive. I guess 
that is a good sign.


Re: std.math performance (SSE vs. real)

2014-07-05 Thread Iain Buclaw via Digitalmars-d
On 5 July 2014 16:13, via Digitalmars-d digitalmars-d@puremagic.com wrote:
 On Saturday, 5 July 2014 at 15:09:28 UTC, Iain Buclaw via Digitalmars-d
 wrote:

 This is a library problem, not a language problem.  In this case
 std.math uses real everywhere when perhaps it shouldn't.


 If x/y leads to a division by zero trap when it should not, then it isn't a
 library problem.


Right, it's a quirk of the CPU.


Re: std.math performance (SSE vs. real)

2014-07-05 Thread via Digitalmars-d
On Saturday, 5 July 2014 at 16:24:28 UTC, Iain Buclaw via 
Digitalmars-d wrote:

Right, it's a quirk of the CPU.


It's a precision quirk of floating point that has to be defined, 
and different CPUs follow different definitions. Within IEEE754 
it can of course also differ, since it does not prevent higher 
precision than specified.


http://en.wikipedia.org/wiki/Denormal_number


Re: std.math performance (SSE vs. real)

2014-07-04 Thread Paolo Invernizzi via Digitalmars-d

On Friday, 4 July 2014 at 01:26:37 UTC, Walter Bright wrote:


The issues you presented are subjective and a matter of 
opinion. Regardless of the state of D, I'm not the type who 
wilts at an issue or two - I work around it. And so does 
everyone else who does production work.


If you sit around waiting for arbitrary perfection, you'll 
never get any work done. I don't care that my truck has dings 
in it, either, it's a truck and it's useful for what I need it 
for :-)


Well said, and that's exactly how things tend to works.
---
Paolo


Re: std.math performance (SSE vs. real)

2014-07-04 Thread Max Samukha via Digitalmars-d

On Friday, 4 July 2014 at 01:26:37 UTC, Walter Bright wrote:



If you sit around waiting for arbitrary perfection, you'll 
never get any work done. I don't care that my truck has dings 
in it, either, it's a truck and it's useful for what I need it 
for :-)


Even though a Tesla is of no more use than your old ugly truck, I 
still favor the former. :P


Re: std.math performance (SSE vs. real)

2014-07-04 Thread Joseph Rushton Wakeling via Digitalmars-d
On Thursday, 3 July 2014 at 14:26:51 UTC, Iain Buclaw via 
Digitalmars-d wrote:
It's also a handy coincidence that for many platforms the 
targets
largest supported FP and *double* type happen to be the same 
too.


Out of curiosity, how is C long double interpreted on those 
platforms?  Just doesn't exist, or is interpreted as the same as 
double?


What's concerning me here is that you've posted at least one 
example platform where the C long double is _not_ the same as the 
largest FP type.


Now, it makes sense to me that the spec _could_ be, real == 
largest hardware-supported FP type, and it makes sense that the 
spec could be, real == C long double for the platform.  But it 
seems quite apparent that it can't mean both, and that there 
needs to be a firm decision about which we want it to be.


Re: std.math performance (SSE vs. real)

2014-07-04 Thread Don via Digitalmars-d

On Thursday, 3 July 2014 at 00:03:47 UTC, Walter Bright wrote:

On 7/2/2014 3:15 PM, Sean Kelly wrote:

On Wednesday, 2 July 2014 at 21:44:17 UTC, Walter Bright wrote:
C long double == D real for 32 and 64 bit OSX, Linux, and 
FreeBSD.


And it's 'double double' on PPC and 128 bit quad on SPARC.
Assuming D targets those platforms, what will be the behavior
there?


Per the D spec, 'real' will be the longest type supported by 
the native hardware.



This is the problem. If that is the case, it is USELESS.
We *must* change that definition.

What is the longest type supported by the native hardware? I 
don't know what that means, and I don't think it even makes sense.


For example, Sparc has 128-bit quads, but they only have partial 
support. Effectively. they are emulated. Why on earth would you 
want to use an emulated type on some machines, but not on others?


Perhaps the intention was the largest precision you can get for 
free, without sacrificing speed then that's not clearly defined. 
On x86-32, that was indeed 80 bits. But on other systems it 
doesn't have an obvious answer.

On x86-64 it's not that simple. Nor on PPC or Sparc.









Re: std.math performance (SSE vs. real)

2014-07-04 Thread Iain Buclaw via Digitalmars-d
On 4 Jul 2014 10:40, Joseph Rushton Wakeling via Digitalmars-d 
digitalmars-d@puremagic.com wrote:

 On Thursday, 3 July 2014 at 14:26:51 UTC, Iain Buclaw via Digitalmars-d
wrote:

 It's also a handy coincidence that for many platforms the targets
 largest supported FP and *double* type happen to be the same too.


 Out of curiosity, how is C long double interpreted on those platforms?
 Just doesn't exist, or is interpreted as the same as double?


Same as double.

 What's concerning me here is that you've posted at least one example
platform where the C long double is _not_ the same as the largest FP type.

 Now, it makes sense to me that the spec _could_ be, real == largest
hardware-supported FP type, and it makes sense that the spec could be,
real == C long double for the platform.  But it seems quite apparent that
it can't mean both, and that there needs to be a firm decision about which
we want it to be.

It's whatever you configure it to be.

Essentially, I want to give porters maximum flexibility on this.

Iain.


Re: std.math performance (SSE vs. real)

2014-07-04 Thread Daniel Murphy via Digitalmars-d

Walter Bright  wrote in message news:lp26l3$qlk$1...@digitalmars.com...

Per the D spec, 'real' will be the longest type supported by the native 
hardware.


So if you were targeting a processor with only soft-float real would be 
undefined?  Fixing the widths of the integers was a great idea, and we 
really should have done the same with the floating point types.  We could 
easily have a library alias for what real currently means.


Not only that, a marquee feature of D is interoperability with C. We'd 
need an AWFULLY good reason to throw that under the bus.


Unfortunately it's a useless definition for portable interop with C++.  real 
needs to always match the size and mangling of long double unless you want 
to stick workarounds all over the bindings.  We have related problems with 
char/char/char and long/longlong/size_t, but luckily relatively few 
interfaces actually use long double. 



Re: std.math performance (SSE vs. real)

2014-07-04 Thread Iain Buclaw via Digitalmars-d
On 4 Jul 2014 13:10, Daniel Murphy via Digitalmars-d 
digitalmars-d@puremagic.com wrote:

 Walter Bright  wrote in message news:lp26l3$qlk$1...@digitalmars.com...


 Per the D spec, 'real' will be the longest type supported by the native
hardware.


 So if you were targeting a processor with only soft-float real would be
undefined?  Fixing the widths of the integers was a great idea, and we
really should have done the same with the floating point types.  We could
easily have a library alias for what real currently means.


FP types are fixed.  float is 32bit, double 64bit.


 Not only that, a marquee feature of D is interoperability with C. We'd
need an AWFULLY good reason to throw that under the bus.


 Unfortunately it's a useless definition for portable interop with C++.
 real needs to always match the size and mangling of long double unless you
want to stick workarounds all over the bindings.  We have related problems
with char/char/char and long/longlong/size_t, but luckily relatively few
interfaces actually use long double.

What 's the mangling problem with long double? There's only *one* long
double.


Re: std.math performance (SSE vs. real)

2014-07-04 Thread via Digitalmars-d

On Friday, 4 July 2014 at 01:26:37 UTC, Walter Bright wrote:

The issues you presented are subjective and a matter of opinion.


Well, one has to agree on a definition for a start! :)

If you sit around waiting for arbitrary perfection, you'll 
never get any work done.


I pick the most stable tool for the job. Meaning I usually end up 
with C, conservative use of C++, Python 2.7, Javascript, SQL or 
XSLT… :-P Rarely D and occasionally Dart (which isn't 
particularly stable either and is rejected beacuase of it) and 
Php (which is pretty stable).


It's a matter of priority. If the D maintainers don't care about 
reaching a stable state, at the expense of scope and features, 
then it will never be the best tool for the job. I regret that.


Re: std.math performance (SSE vs. real)

2014-07-04 Thread bearophile via Digitalmars-d

Ola Fosheim Grøstad:

If the D maintainers don't care about reaching a stable state, 
at the expense of scope and features,


Don't be silly, D devs care a lot about reaching stability, 
fixing bugs, etc.


Bye,
bearophile


Re: std.math performance (SSE vs. real)

2014-07-04 Thread Daniel Murphy via Digitalmars-d


Iain Buclaw via Digitalmars-d digitalmars-d@puremagic.com wrote in 
message news:mailman.3265.1404477916.2907.digitalmar...@puremagic.com...



FP types are fixed.  float is 32bit, double 64bit.


That's 2/3.

What 's the mangling problem with long double? There's only *one* long 
double.


long double may not be the same size as D's real, eg in msvc it's 64-bit. 
You can still still call these functions from D using double in C, but the 
mangling will not match in C++.




Re: std.math performance (SSE vs. real)

2014-07-04 Thread Iain Buclaw via Digitalmars-d
On 4 July 2014 14:01, Daniel Murphy via Digitalmars-d
digitalmars-d@puremagic.com wrote:

 Iain Buclaw via Digitalmars-d digitalmars-d@puremagic.com wrote in
 message news:mailman.3265.1404477916.2907.digitalmar...@puremagic.com...


 FP types are fixed.  float is 32bit, double 64bit.


 That's 2/3.


 What 's the mangling problem with long double? There's only *one* long
 double.

'
 long double may not be the same size as D's real, eg in msvc it's 64-bit.
 You can still still call these functions from D using double in C, but the
 mangling will not match in C++.


You're confusing long double with size_t.  I did a cursory look up
msvc++ mangling, and long double is always 'O'.  The itanium spec says
that long double is 'e' - unless 128bits in which case it is 'g'.

Iain.


Re: std.math performance (SSE vs. real)

2014-07-04 Thread Daniel Murphy via Digitalmars-d
Iain Buclaw via Digitalmars-d  wrote in message 
news:mailman.3268.1404486824.2907.digitalmar...@puremagic.com...



You're confusing long double with size_t.  I did a cursory look up
msvc++ mangling, and long double is always 'O'.  The itanium spec says
that long double is 'e' - unless 128bits in which case it is 'g'.


Yes, so msvc++ has two 64-bit floating types with different manglings, and D 
has one.  D does not have a type that can be used to match long double's 
mangling with msvc. 



Re: std.math performance (SSE vs. real)

2014-07-04 Thread Iain Buclaw via Digitalmars-d
On 4 July 2014 17:31, Daniel Murphy via Digitalmars-d
digitalmars-d@puremagic.com wrote:
 Iain Buclaw via Digitalmars-d  wrote in message
 news:mailman.3268.1404486824.2907.digitalmar...@puremagic.com...


 You're confusing long double with size_t.  I did a cursory look up
 msvc++ mangling, and long double is always 'O'.  The itanium spec says
 that long double is 'e' - unless 128bits in which case it is 'g'.


 Yes, so msvc++ has two 64-bit floating types with different manglings, and D
 has one.  D does not have a type that can be used to match long double's
 mangling with msvc.

No, msvc++ has one mangle type.  Itanium has two, but you're never
going to run into a situation where there's a conflict because long
double can't be both 80bit and 128bit at the same time!


Re: std.math performance (SSE vs. real)

2014-07-04 Thread Walter Bright via Digitalmars-d

On 7/4/2014 1:37 AM, Max Samukha wrote:

On Friday, 4 July 2014 at 01:26:37 UTC, Walter Bright wrote:



If you sit around waiting for arbitrary perfection, you'll never get any work
done. I don't care that my truck has dings in it, either, it's a truck and
it's useful for what I need it for :-)


Even though a Tesla is of no more use than your old ugly truck, I still favor
the former. :P


You wouldn't use a Tesla for hauling!


Re: std.math performance (SSE vs. real)

2014-07-04 Thread Walter Bright via Digitalmars-d
On 7/4/2014 5:48 AM, Ola Fosheim Grøstad 
ola.fosheim.grostad+dl...@gmail.com wrote:

I pick the most stable tool for the job. Meaning I usually end up with C,
conservative use of C++, Python 2.7, Javascript, SQL or XSLT… :-P Rarely D and
occasionally Dart (which isn't particularly stable either and is rejected
beacuase of it) and Php (which is pretty stable).

It's a matter of priority. If the D maintainers don't care about reaching a
stable state, at the expense of scope and features, then it will never be the
best tool for the job. I regret that.


We care a great deal about that.

C++, etc., is a much harder tool to get work done with. You'd have to judge that 
difficulty and work increase against the dealing with imperfections in D. It's a 
clear win for D.




Re: std.math performance (SSE vs. real)

2014-07-04 Thread Walter Bright via Digitalmars-d

On 7/4/2014 5:06 AM, Daniel Murphy wrote:

Walter Bright  wrote in message news:lp26l3$qlk$1...@digitalmars.com...


Per the D spec, 'real' will be the longest type supported by the native 
hardware.


So if you were targeting a processor with only soft-float real would be
undefined?  Fixing the widths of the integers was a great idea, and we really
should have done the same with the floating point types.  We could easily have a
library alias for what real currently means.


Again, I expect the implementor for Platform X to be able to make a solid 
judgement on what to do for that platform that makes the most sense.




Not only that, a marquee feature of D is interoperability with C. We'd need an
AWFULLY good reason to throw that under the bus.

Unfortunately it's a useless definition for portable interop with C++.  real
needs to always match the size and mangling of long double unless you want to
stick workarounds all over the bindings.  We have related problems with
char/char/char and long/longlong/size_t,


Such problems disappear when common sense is applied.



but luckily relatively few interfaces actually use long double.


I really do not understand what the big problem is. It's trivial to interface 
with C code on Linux that accepts long doubles on all platforms D currently 
supports.


Re: std.math performance (SSE vs. real)

2014-07-04 Thread Walter Bright via Digitalmars-d

On 7/4/2014 3:38 AM, Don wrote:

What is the longest type supported by the native hardware? I don't know what
that means, and I don't think it even makes sense.


Most of the time, it is quite clear.



For example, Sparc has 128-bit quads, but they only have partial support.
Effectively. they are emulated. Why on earth would you want to use an emulated
type on some machines, but not on others?


Emulation is not native support.



Perhaps the intention was the largest precision you can get for free, without
sacrificing speed then that's not clearly defined. On x86-32, that was indeed
80 bits. But on other systems it doesn't have an obvious answer.
On x86-64 it's not that simple. Nor on PPC or Sparc.


Yes, there is some degree of subjectivity on some platforms. I don't see a good 
reason for hamstringing the compiler dev with legalese for Platform X with 
legalese that isn't quite the right thing to do for X.


I think the intention of the spec is clear, and the compiler implementor can be 
relied on to exercise good judgement.




Re: std.math performance (SSE vs. real)

2014-07-04 Thread Walter Bright via Digitalmars-d

On 7/4/2014 6:01 AM, Daniel Murphy wrote:

long double may not be the same size as D's real, eg in msvc it's 64-bit. You
can still still call these functions from D using double in C, but the mangling
will not match in C++.



You are correct in that VC++ mangles double as 'N' and long double as 'O' but 
both are implemented as doubles.


This means that:

void foo(long double d);

is callable from D if it is compiled as C, but not as C++.

This is not a language lawyer problem, as D isn't guaranteed to support all C++ 
mangling. As a practical problem, it would be pretty rare (since such code 
usually provides double overloads), and if it still was a problem a bit of 
adapter C++ code (a 1 liner) can be written.


Re: std.math performance (SSE vs. real)

2014-07-04 Thread John Colvin via Digitalmars-d

On Friday, 4 July 2014 at 17:05:16 UTC, Walter Bright wrote:

On 7/4/2014 3:38 AM, Don wrote:
What is the longest type supported by the native hardware? I 
don't know what

that means, and I don't think it even makes sense.


Most of the time, it is quite clear.


For example, Sparc has 128-bit quads, but they only have 
partial support.
Effectively. they are emulated. Why on earth would you want to 
use an emulated

type on some machines, but not on others?


Emulation is not native support.


Perhaps the intention was the largest precision you can get 
for free, without
sacrificing speed then that's not clearly defined. On x86-32, 
that was indeed
80 bits. But on other systems it doesn't have an obvious 
answer.

On x86-64 it's not that simple. Nor on PPC or Sparc.


Yes, there is some degree of subjectivity on some platforms. I 
don't see a good reason for hamstringing the compiler dev with 
legalese for Platform X with legalese that isn't quite the 
right thing to do for X.


I think the intention of the spec is clear, and the compiler 
implementor can be relied on to exercise good judgement.


Who are these compiler implementers? Are you actually 
suggesting that, for example, ldc and gdc would seperately decide


Re: std.math performance (SSE vs. real)

2014-07-04 Thread Walter Bright via Digitalmars-d

On 7/4/2014 10:42 AM, John Colvin wrote:

Who are these compiler implementers?


Whoever decides to implement D for a particular platform.



Are you actually suggesting that, for example, ldc and gdc would seperately 
decide


I am confident they will exercise good judgement in making their implementation 
of D as useful as practical.




Re: std.math performance (SSE vs. real)

2014-07-04 Thread via Digitalmars-d

On Friday, 4 July 2014 at 12:59:41 UTC, bearophile wrote:
If the D maintainers don't care about reaching a stable state, 
at the expense of scope and features,


Don't be silly, D devs care a lot about reaching stability, 
fixing bugs, etc.


But not to the extent that they are willing to limit the scope 
and features to get there in reasonable time for D2 (say 10 
months), so the feature set is expanding and the scope of the 
standard library is too big for a stable mature library that is 
easy to use to be feasible as far as I can tell. Dart is going 
down the same path. It affects adoption, which in turn affects 
the eco system. Basically Dart pushed their commercial adoption 
two years into the future by not commiting to stable platform 
support, claming that they only support evergreen browsers, 
whatever that means. Which pretty much lets Google, Apple and 
Microsoft define platform stability.


I'm not trying to be pushy or silly. I just want to know if the 
most probable path for an alternative system development language 
is a fork or spinning up a new project.


Evolutionary development is great when there is great uncertainty 
and you need prototyping, but then you need to focus on getting 
to something that is tight, uniform, portable (future proof) and 
feasible with the available resources.


A good starting point would be to get down to locking down the 
specs in a coherent and platform agnostic manner, then plan for 
making a mature toolset to support it. The D spec should be clear 
on what IEEE 754 compliance actually means and relate it to all 
probable scenarios. That would be a very useful exercise in 
decision making.


Re: std.math performance (SSE vs. real)

2014-07-04 Thread Walter Bright via Digitalmars-d
On 7/4/2014 12:07 PM, Ola Fosheim Grøstad 
ola.fosheim.grostad+dl...@gmail.com wrote:

The D spec should be clear on what IEEE 754 compliance actually
means and relate it to all probable scenarios.


I'm curious how that would affect anyone currently using dmd/gdc/ldc in getting 
professional work done.




Re: std.math performance (SSE vs. real)

2014-07-04 Thread via Digitalmars-d

On Friday, 4 July 2014 at 19:53:11 UTC, Walter Bright wrote:
I'm curious how that would affect anyone currently using 
dmd/gdc/ldc in getting professional work done.


It doesn't affect them since they are on x86 (until they want to 
use co-processor auto-vectorization). As far as I can tell, also 
Intel CPUs such as Phi are faster if you skip on IEEE754 
conformance for denormal numbers. So I think this is a trend, 
backed empirically by CPUs by IBM, ARM and Intel.


The most important factor is that it does affect the credibility 
of the spec. The spec is the vision that people either embrace or 
reject. For those devs who aren't happy with status quo having a 
credible spec that the team is committed to is important, because 
it says what outcome they can expect if they start contributing. 
There is very little incentive to contribute if you think that 
the current D incarnation is insufficient, unless the team specs 
out what D is to become.


If you can commit to a spec for D2 that is final, then you can 
also plan for when D2 is done.


Re: std.math performance (SSE vs. real)

2014-07-04 Thread Walter Bright via Digitalmars-d
On 7/4/2014 1:13 PM, Ola Fosheim Grøstad 
ola.fosheim.grostad+dl...@gmail.com wrote:

If you can commit to a spec for D2 that is final, then you can also plan for
when D2 is done.


There's no such thing as done for a working language. C++, for example, is 
constantly in flux. Every release by every vendor alters which parts of the 
standard and draft standard it supports. Furthermore, the C/C++ Standards don't 
have much to say about how floating point works - how is that of any help in 
writing professional, stable fp code?


Do we want to make the spec better? Yes.

Does that impair professional use of D now? No.

Do we accept pull requests on the spec to make it better? Yes.

Have you contributed to any pull requests to improve the spec?

Please, contribute to the things you care about, instead of suggesting in the 
n.g. that others should do it. That would be far more helpful.


Re: std.math performance (SSE vs. real)

2014-07-04 Thread via Digitalmars-d

On Friday, 4 July 2014 at 20:28:36 UTC, Walter Bright wrote:
There's no such thing as done for a working language. C++, for 
example, is constantly in flux. Every release by every vendor 
alters which parts of the standard and draft standard it 
supports.


And no sane devs rely on those experimental parts unless g++ or 
clang commits themselves to them. The C++ standard specs out 
things in advance at intervals specified in years, not weeks.


Furthermore, the C/C++ Standards don't have much to say about 
how floating point works - how is that of any help in writing 
professional, stable fp code?


You know that you are on your own and cannot make assumptions 
about conformance, and address it with code (like ifdefs).



Do we want to make the spec better? Yes.


Not make the spec better or bring it up to date with the 
implementation. Spec out the language so people know what the 
missing bits are.


Please, contribute to the things you care about, instead of 
suggesting in the n.g. that others should do it. That would be 
far more helpful.


That would imply a fork. And yes, I think that might be the most 
likely outcome that someone forks it.


I don't believe in language design by a comittee. I think the 
language designers should spec out their vision. Let the 
community point out the flaws. Go back to the drawing board. Do 
some rounds. Then commit to it.


I think that would attract more contribution to the core language 
development.


I am interested in contributing code to make a good spec come to 
life, not to add noise to an endless contractual metamorphosis 
that never will lead to anything consistent and coherent.




Re: std.math performance (SSE vs. real)

2014-07-04 Thread Walter Bright via Digitalmars-d
On 7/4/2014 1:41 PM, Ola Fosheim Grøstad 
ola.fosheim.grostad+dl...@gmail.com wrote:

On Friday, 4 July 2014 at 20:28:36 UTC, Walter Bright wrote:

There's no such thing as done for a working language. C++, for example, is
constantly in flux. Every release by every vendor alters which parts of the
standard and draft standard it supports.


And no sane devs rely on those experimental parts unless g++ or clang commits
themselves to them. The C++ standard specs out things in advance at intervals
specified in years, not weeks.


As I said, C++ vendors often implement things far in advance of spec approval, 
they do it piecemeal, and different vendors do things in different orders. C++ 
evangelists are constantly rewriting what C++ best practices are. To 
characterize all this churn as stablility is awfully charitable.




Furthermore, the C/C++ Standards don't have much to say about how floating
point works - how is that of any help in writing professional, stable fp code?

You know that you are on your own and cannot make assumptions about conformance,
and address it with code (like ifdefs).


Uh-huh. And how much professional code have you seen that had #ifdef's for Vax 
fp in it? IBM fp? Future CPUs that don't exist yet? How many developers have 
access to a Vax to test their #ifdef's on?


Next, consider how much C++ code breaks when ported from 32 to 64 bits. It's 
most of it, even mine, and I know what I'm doing. What you're implying is saying 
that when a spec says implementation defined then voila! the code is portable!




Do we want to make the spec better? Yes.

Not make the spec better or bring it up to date with the implementation. Spec
out the language so people know what the missing bits are.


Please contribute to those areas of the spec you feel need improvement. 
Non-specific statements like bring it up to date are not helpful.




Please, contribute to the things you care about, instead of suggesting in the
n.g. that others should do it. That would be far more helpful.

That would imply a fork. And yes, I think that might be the most likely outcome
that someone forks it.


A pull request does not imply a fork.



I don't believe in language design by a comittee.


The only alternative is you believe I need to do all the work. This is not 
possible. I am not superman, nor am I expert at everything.


Sadly, this also implies that there are no computer languages you believe in. 
You set an impossible standard. How can you possibly say you prefer C++, a 
classic design by committee language?




I think the language designers
should spec out their vision. Let the community point out the flaws. Go back to
the drawing board. Do some rounds. Then commit to it.

I think that would attract more contribution to the core language development.


I'm asking you to contribute. These posts do not accomplish anything. Exhorting 
me to do more (I already work on D 24/7) cannot work.




I am interested in contributing code to make a good spec come to life, not to
add noise to an endless contractual metamorphosis that never will lead to
anything consistent and coherent.


Nothing will improve if you and others remain on the sidelines. Get out in front 
and make what you want to happen, happen.




Re: std.math performance (SSE vs. real)

2014-07-04 Thread Jonathan M Davis via Digitalmars-d
On Thu, 3 Jul 2014 14:01:23 -0700
Jonathan M Davis via Digitalmars-d digitalmars-d@puremagic.com wrote:

 I'm fine with real varying from platform to platform depending on
 what makes sense for that platform, but I think that it should be
 clear what real is generally supposed to be (e.g. the largest
 floating point type that the hardware supports), but unless it's
 _guaranteed_ that real be the same as long double, I would strongly
 argue in favor of having an alias for long double rather than using
 real directly (much as it will likely be an alias to real in most
 cases). We already do that with c_long.

Here: https://github.com/D-Programming-Language/druntime/pull/863

- Jonathan M Davis


Re: std.math performance (SSE vs. real)

2014-07-04 Thread via Digitalmars-d

On Friday, 4 July 2014 at 21:08:27 UTC, Walter Bright wrote:
rewriting what C++ best practices are. To characterize all 
this churn as stablility is awfully charitable.


Pfft, a lot of performance C++ code is roughly in 1998 land 
without exceptions and rtti.


Uh-huh. And how much professional code have you seen that had 
#ifdef's for Vax fp in it? IBM fp? Future CPUs that don't exist 
yet? How many developers have access to a Vax to test their 
#ifdef's on?


It is not uncommon for portable DSP code to have ifdefs. It is 
not uncommon to have ifdefs for extracting the mantissa etc. 
Heck, even for uints you might need ifdefs, to account for 
whether you have wrapping uints or not in phase counters. 
(wrapping over 31 bits or 32 bits)


Considering that denormal numbers being flushed to zero is 
non-standard and not uncommon, it would be wise to somehow 
support it with version{}, so you can specify what assumptions a 
particular function make. That way you might get not 
implemented as a  compile time error when porting to a new 
platform.


What you're implying is saying that when a spec says 
implementation defined then voila! the code is portable!


No, it says voila! the code is not portable and then you can 
inject your own guards that might prevent it from compiling on 
nonconforming platforms and let you know what you need to look at.


Sadly, this also implies that there are no computer languages 
you believe in. You set an impossible standard. How can you 
possibly say you prefer C++, a classic design by committee 
language?


I don't prefer it. I think it sucks, but it is the only viable 
choice if you want to create a scalable game or virtual world 
server. And since C++ is the crappy shit it is, you usually have 
to build a language on top of it to keep the server stable and 
modifiable and stay sane. A key benefit of a tighter version of D 
would be to avoid that extra layer IMO.


I'm asking you to contribute. These posts do not accomplish 
anything. Exhorting me to do more (I already work on D 24/7) 
cannot work.


Maybe you and Andrei could consider having other people do the 
stuff you don't have to do, but that other people can take care 
of? Because I think you and Andrei are the only ones who can spec 
out the changes that would make D a clean delightful language to 
use and get acceptance for it in the community.


The alternative is to fork it, cut down on features, clean up the 
syntax for DSL purposes, rip out the GC and add transactional 
memory support. I think the current process is too slow for 
outsiders to get D to production level in the domains where speed 
and stability truly matters.


Re: std.math performance (SSE vs. real)

2014-07-03 Thread Iain Buclaw via Digitalmars-d
On 3 Jul 2014 01:50, Walter Bright via Digitalmars-d 
digitalmars-d@puremagic.com wrote:

 On 7/2/2014 2:28 PM, Iain Buclaw via Digitalmars-d wrote:

 On 2 July 2014 19:58, via Digitalmars-d digitalmars-d@puremagic.com
wrote:

 I don't really understand the reasoning here. Is D Intel x86 specific?

 Yes it is, more than you might realise.  I've been spending the last 4

 years breaking it to be platform agnostic. :o)


 I think you're conflating dmd with D.


I suppose I am just a bit. At the time I was thinking about the spec on
_argptr (which has been fixed), __simd and intrinsics.


Re: std.math performance (SSE vs. real)

2014-07-03 Thread Iain Buclaw via Digitalmars-d
On 3 Jul 2014 04:50, Sean Kelly via Digitalmars-d 
digitalmars-d@puremagic.com wrote:

 On Thursday, 3 July 2014 at 01:13:13 UTC, H. S. Teoh via Digitalmars-d
wrote:


 I'm not sure I understand how removing support 80-bit floats hurts
interoperability with C? I thought none of the standard C float types map
to the x87 80-bit float?


 The C spec never says anything specific about representation because it's
meant to target anything, but the x86 and AMD64 ABIs basically say that
long double is 80-bit for calculations.  The x86 spec says that the type
is stored in 96 bits though, and the AMD64 spec says they're stored in 128
bits for alignment purposes.

 I'm still unclear whether we're aiming for C interoperability or hardware
support though, based on Walter's remark about SPARC and PPC.  There, 'long
double' is represented differently but is not backed by specialized
hardware, so I'm guessing D would make 'real' 64-bits on these platforms
and break compatibility with C.  So... I guess we really do need a special
alias for C compatibility, and this can map to whatever intrinsic type the
applicable compiler supports for that platform.

I take the spec to mean that I can map float, double, and real to the
native C types for float, double, and long double - or in jargon terms, the
native single, double, and extended (or quad if the user or backend
requests it) types.

Certainly I have implemented my bits of std.math with real == double and
real == quad in mind.  PPC will have to wait, but it is easy enough to
identify doubledouble reals in CTFE.

Iain.


Re: std.math performance (SSE vs. real)

2014-07-03 Thread Paolo Invernizzi via Digitalmars-d
On Wednesday, 2 July 2014 at 12:24:51 UTC, Ola Fosheim Grøstad 
wrote:

On Wednesday, 2 July 2014 at 12:16:18 UTC, Wanderer wrote:

D is not even production ready, so why should there be? Who in 
their right mind would use a language in limbo for building a 
serious operating system or do embedded work? You need language 
stability and compiler maturity first.


That's plain wrong: here at SR Labs we are using it in 
production, and making money over it.


---
Paolo


Re: std.math performance (SSE vs. real)

2014-07-03 Thread Walter Bright via Digitalmars-d

On 7/2/2014 6:11 PM, H. S. Teoh via Digitalmars-d wrote:

What should we do in the case of hardware that offers strange hardware
types, like a hypothetical 48-bit floating point type? Should D offer a
built-in type for that purpose, even if it only exists on a single chip
that's used by 0.01% of the community?


I'd leave that decision up to the guy implementing the D compiler for that chip.



Not only that, a marquee feature of D is interoperability with C. We'd
need an AWFULLY good reason to throw that under the bus.


I'm not sure I understand how removing support 80-bit floats hurts
interoperability with C? I thought none of the standard C float types
map to the x87 80-bit float?

(I'm not opposed to keeping real as 80-bit on x87, but I just don't
understand what this has to do with C interoperability.)


For the 4th time in this thread, the C ABI for x86 32 and 64 bit OSX, Linux, and 
FreeBSD maps long double to 80 bit reals.


How can you call a C function:

   int foo(long double r);

??



Re: std.math performance (SSE vs. real)

2014-07-03 Thread Walter Bright via Digitalmars-d

On 7/2/2014 11:38 PM, Iain Buclaw via Digitalmars-d wrote:

I suppose I am just a bit. At the time I was thinking about the spec on _argptr
(which has been fixed), __simd and intrinsics.



You do have a good point with those aspects.


Re: std.math performance (SSE vs. real)

2014-07-03 Thread Walter Bright via Digitalmars-d

On 7/2/2014 8:48 PM, Sean Kelly wrote:

I'm still unclear whether we're aiming for C interoperability or hardware
support though, based on Walter's remark about SPARC and PPC.  There, 'long
double' is represented differently but is not backed by specialized hardware, so
I'm guessing D would make 'real' 64-bits on these platforms and break
compatibility with C.  So... I guess we really do need a special alias for C
compatibility, and this can map to whatever intrinsic type the applicable
compiler supports for that platform.


What is unclear about being able to call a C function declared as:

int foo(long double r);

from D?



Re: std.math performance (SSE vs. real)

2014-07-03 Thread Joseph Rushton Wakeling via Digitalmars-d

On Thursday, 3 July 2014 at 00:49:33 UTC, Walter Bright wrote:

On 7/2/2014 2:28 PM, Iain Buclaw via Digitalmars-d wrote:
On 2 July 2014 19:58, via Digitalmars-d 
digitalmars-d@puremagic.com wrote:
I don't really understand the reasoning here. Is D Intel x86 
specific?
Yes it is, more than you might realise.  I've been spending 
the last 4

years breaking it to be platform agnostic. :o)


I think you're conflating dmd with D.

And IEEE 754 is a standard.


I understand what you're saying here, which is that any 
conflation of D with x86 is a fault in the implementation rather 
than the spec, but at the end of the day, D lives by its 
implementation.


It's not just about what the dmd backend supports per se, but 
about what assumptions that leads people to make when writing 
code for the frontend, runtime and standard library.  Iain has 
done some heroic work in the last year going through compiler 
frontend, runtime and Phobos and correcting code with faulty 
assumptions such as real == 80 bit floating point (which IIRC 
was often made as a general assumption even though it's 
x86-specific).


Re: std.math performance (SSE vs. real)

2014-07-03 Thread Jonathan M Davis via Digitalmars-d
On Wed, 02 Jul 2014 23:56:21 -0700
Walter Bright via Digitalmars-d digitalmars-d@puremagic.com wrote:

 On 7/2/2014 8:48 PM, Sean Kelly wrote:
  I'm still unclear whether we're aiming for C interoperability or
  hardware support though, based on Walter's remark about SPARC and
  PPC.  There, 'long double' is represented differently but is not
  backed by specialized hardware, so I'm guessing D would make 'real'
  64-bits on these platforms and break compatibility with C.  So... I
  guess we really do need a special alias for C compatibility, and
  this can map to whatever intrinsic type the applicable compiler
  supports for that platform.

 What is unclear about being able to call a C function declared as:

  int foo(long double r);

 from D?

I don't think that there's anything unclear about that. The problem is that if
real is supposed to be the largest hardware supported floating point type,
then that doesn't necessarily match long double. It happens to on x86 and
x86_64, but it doesn't on other architectures.

So, is real the same as C's long double, or is it the same as the largest
floating point type supported by the hardware? We have erroneously treated
them as the same thing, because they happen to be the same thing on x86
hardware. But D needs to work on more than just x86 and x86_64, even if dmd
doesn't.

We already have aliases such as c_long to deal with C types. I don't think
that it would be all that big a deal to make it so that real was specifically
the largest supported hardware type and then have c_long_double for
interacting with C.

- Jonathan M Davis


Re: std.math performance (SSE vs. real)

2014-07-03 Thread Iain Buclaw via Digitalmars-d
On 3 July 2014 11:49, Jonathan M Davis via Digitalmars-d
digitalmars-d@puremagic.com wrote:
 On Wed, 02 Jul 2014 23:56:21 -0700
 Walter Bright via Digitalmars-d digitalmars-d@puremagic.com wrote:

 On 7/2/2014 8:48 PM, Sean Kelly wrote:
  I'm still unclear whether we're aiming for C interoperability or
  hardware support though, based on Walter's remark about SPARC and
  PPC.  There, 'long double' is represented differently but is not
  backed by specialized hardware, so I'm guessing D would make 'real'
  64-bits on these platforms and break compatibility with C.  So... I
  guess we really do need a special alias for C compatibility, and
  this can map to whatever intrinsic type the applicable compiler
  supports for that platform.

 What is unclear about being able to call a C function declared as:

  int foo(long double r);

 from D?

 I don't think that there's anything unclear about that. The problem is that if
 real is supposed to be the largest hardware supported floating point type,
 then that doesn't necessarily match long double. It happens to on x86 and
 x86_64, but it doesn't on other architectures.

 So, is real the same as C's long double, or is it the same as the largest
 floating point type supported by the hardware? We have erroneously treated
 them as the same thing, because they happen to be the same thing on x86
 hardware. But D needs to work on more than just x86 and x86_64, even if dmd
 doesn't.


The spec should be clearer on that.  The language should respect the
long double ABI of the platform it is targeting - so if the compiler
is targeting a real=96bit system, but the max supported on the chip is
128bit, the compiler should *still* map real to the 96bit long
doubles, unless explicitly told otherwise on the command-line.

The same goes to other ABI aspects of real, for instance, if you are
targeting an ABI where scalar 64bit operations are done in Neon, then
the compiler adheres to that (though I'd hope that people stick to
defaults and not do this, because the cost of moving data from core
registers to neon is high).

Regards
Iain


Re: std.math performance (SSE vs. real)

2014-07-03 Thread Joseph Rushton Wakeling via Digitalmars-d
On Thursday, 3 July 2014 at 11:21:34 UTC, Iain Buclaw via 
Digitalmars-d wrote:
The spec should be clearer on that.  The language should 
respect the long double ABI of the platform it is targeting

- so if the compiler is targeting a real=96bit system, but
the max supported on the  chip is 128bit, the compiler should
*still* map real to the 96bit long doubles, unless explicitly
told otherwise on the command-line.


This would be a change in the standard, no?  The long double ABI 
of the target platform is not necessarily the same as the 
current definition of real as the largest hardware-supported 
floating-point type.


I can't help but feel that this is another case where the 
definition of real in the D spec, and its practical use in the 
implementation, have wound up in conflict because of assumptions 
made relative to x86, where it's simply a nice coincidence that 
the largets hardware-supported FP and the long double type happen 
to be the same.


Re: std.math performance (SSE vs. real)

2014-07-03 Thread Iain Buclaw via Digitalmars-d
On 3 July 2014 14:51, Joseph Rushton Wakeling via Digitalmars-d
digitalmars-d@puremagic.com wrote:
 On Thursday, 3 July 2014 at 11:21:34 UTC, Iain Buclaw via Digitalmars-d
 wrote:

 The spec should be clearer on that.  The language should respect the long
 double ABI of the platform it is targeting
 - so if the compiler is targeting a real=96bit system, but
 the max supported on the  chip is 128bit, the compiler should
 *still* map real to the 96bit long doubles, unless explicitly
 told otherwise on the command-line.


 This would be a change in the standard, no?  The long double ABI of the
 target platform is not necessarily the same as the current definition of
 real as the largest hardware-supported floating-point type.

 I can't help but feel that this is another case where the definition of real
 in the D spec, and its practical use in the implementation, have wound up in
 conflict because of assumptions made relative to x86, where it's simply a
 nice coincidence that the largets hardware-supported FP and the long double
 type happen to be the same.

It's also a handy coincidence that for many platforms the targets
largest supported FP and *double* type happen to be the same too.


Re: std.math performance (SSE vs. real)

2014-07-03 Thread Sean Kelly via Digitalmars-d

On Thursday, 3 July 2014 at 06:56:20 UTC, Walter Bright wrote:

On 7/2/2014 8:48 PM, Sean Kelly wrote:
I'm still unclear whether we're aiming for C interoperability 
or hardware
support though, based on Walter's remark about SPARC and PPC.  
There, 'long
double' is represented differently but is not backed by 
specialized hardware, so
I'm guessing D would make 'real' 64-bits on these platforms 
and break
compatibility with C.  So... I guess we really do need a 
special alias for C
compatibility, and this can map to whatever intrinsic type the 
applicable

compiler supports for that platform.


What is unclear about being able to call a C function declared 
as:


int foo(long double r);

from D?


This:

On Thursday, 3 July 2014 at 00:03:47 UTC, Walter Bright wrote:

On 7/2/2014 3:15 PM, Sean Kelly wrote:

On Wednesday, 2 July 2014 at 21:44:17 UTC, Walter Bright wrote:
C long double == D real for 32 and 64 bit OSX, Linux, and 
FreeBSD.


And it's 'double double' on PPC and 128 bit quad on SPARC.
Assuming D targets those platforms, what will be the behavior
there?


Per the D spec, 'real' will be the longest type supported by 
the native hardware.


Re: std.math performance (SSE vs. real)

2014-07-03 Thread Walter Bright via Digitalmars-d

On 7/3/2014 8:36 AM, Sean Kelly wrote:

Per the D spec, 'real' will be the longest type supported by the native 
hardware.


It's not necessary that real be long double - but it is necessary that long 
double be callable from D.


Case in point: long double on Win64 is accessible with D's double, but D also 
supports 80 bit real.


Re: std.math performance (SSE vs. real)

2014-07-03 Thread Walter Bright via Digitalmars-d

On 7/3/2014 3:49 AM, Jonathan M Davis via Digitalmars-d wrote:

I don't think that there's anything unclear about that. The problem is that if
real is supposed to be the largest hardware supported floating point type,
then that doesn't necessarily match long double. It happens to on x86 and
x86_64, but it doesn't on other architectures.


As it turns out, C compilers tend to use long double for that. So there's no 
issue. In any case, it's up to the person porting the D compiler to that 
platform to make these decisions.


For another case, D for Win64 maps real to 80 bits, despite VC++ mapping long 
double to 64 bits. This is compatible with the D spec, because you are still 
able to call C functions typed as int foo(long double r) because D's double 
works for that.


I think that some common sense on a case by case basis for each platform should 
work fine.




Re: std.math performance (SSE vs. real)

2014-07-03 Thread Tofu Ninja via Digitalmars-d

On Thursday, 3 July 2014 at 19:47:32 UTC, Walter Bright wrote:

On 7/3/2014 8:36 AM, Sean Kelly wrote:
Per the D spec, 'real' will be the longest type supported by 
the native hardware.


It's not necessary that real be long double - but it is 
necessary that long double be callable from D.


Case in point: long double on Win64 is accessible with D's 
double, but D also supports 80 bit real.


That makes it seem like we are compatible by accident rather than 
by design.


Re: std.math performance (SSE vs. real)

2014-07-03 Thread Jonathan M Davis via Digitalmars-d
On Thu, 03 Jul 2014 12:45:17 -0700
Walter Bright via Digitalmars-d digitalmars-d@puremagic.com wrote:

 On 7/3/2014 3:49 AM, Jonathan M Davis via Digitalmars-d wrote:
  I don't think that there's anything unclear about that. The problem
  is that if real is supposed to be the largest hardware supported
  floating point type, then that doesn't necessarily match long
  double. It happens to on x86 and x86_64, but it doesn't on other
  architectures.

 As it turns out, C compilers tend to use long double for that. So
 there's no issue. In any case, it's up to the person porting the D
 compiler to that platform to make these decisions.

 For another case, D for Win64 maps real to 80 bits, despite VC++
 mapping long double to 64 bits. This is compatible with the D spec,
 because you are still able to call C functions typed as int foo(long
 double r) because D's double works for that.

 I think that some common sense on a case by case basis for each
 platform should work fine.

I'm fine with real varying from platform to platform depending on what makes
sense for that platform, but I think that it should be clear what real is
generally supposed to be (e.g. the largest floating point type that the
hardware supports), but unless it's _guaranteed_ that real be the same as long
double, I would strongly argue in favor of having an alias for long double
rather than using real directly (much as it will likely be an alias to real in
most cases). We already do that with c_long.

- Jonathan M Davis


Re: std.math performance (SSE vs. real)

2014-07-03 Thread Sean Kelly via Digitalmars-d

On Thursday, 3 July 2014 at 21:01:43 UTC, Jonathan M Davis via
Digitalmars-d wrote:


I'm fine with real varying from platform to platform depending 
on what makes sense for that platform, but I think that it 
should be clear what real is generally supposed to be (e.g. the 
largest floating point type that the hardware supports), but 
unless it's _guaranteed_ that real be the same as long double, 
I would strongly argue in favor of having an alias for long 
double rather than using real directly (much as it will likely 
be an alias to real in most cases). We already do that with 
c_long.


I'm inclined to agree.  From what's been said, I suspect that on
SPARC, 'real' would be an alias of 'double', and c_long_double
would be an alias of some intrinsic type provided by the
compiler, since there is no D equivalent for the IEEE 754
binary128 type.  The alternative, making c_long_double a struct
used for marshaling data into and out of the C format, doesn't
seem terribly appealing.


Re: std.math performance (SSE vs. real)

2014-07-03 Thread via Digitalmars-d

On Wednesday, 2 July 2014 at 21:45:41 UTC, Walter Bright wrote:
On 7/2/2014 5:24 AM, Ola Fosheim Grøstad 
ola.fosheim.grostad+dl...@gmail.com wrote:

D is not even production ready,


Of course it is.


Not by my definition of production ready:

1. Not stable or up to date language spec.
2. Outstanding significant issues in the bug tracker.
3. No mature compiler.
4. No mature runtime.
5. No stable std library.
6. No entity/vendor that provides support/maintenance for a 
specific version of D for a specified period of time.


Would you use D for building software to ship with hardware 
appliances?


I would not.


Re: std.math performance (SSE vs. real)

2014-07-03 Thread Iain Buclaw via Digitalmars-d
On 3 July 2014 22:43, via Digitalmars-d digitalmars-d@puremagic.com wrote:
 On Wednesday, 2 July 2014 at 21:45:41 UTC, Walter Bright wrote:

 On 7/2/2014 5:24 AM, Ola Fosheim Grøstad
 ola.fosheim.grostad+dl...@gmail.com wrote:

 D is not even production ready,


 Of course it is.


 Not by my definition of production ready:

 1. Not stable or up to date language spec.
 2. Outstanding significant issues in the bug tracker.
 3. No mature compiler.
 4. No mature runtime.
 5. No stable std library.
 6. No entity/vendor that provides support/maintenance for a specific version
 of D for a specified period of time.


You must know something I don't. :o)



Re: std.math performance (SSE vs. real)

2014-07-03 Thread H. S. Teoh via Digitalmars-d
On Thu, Jul 03, 2014 at 09:43:38PM +, via Digitalmars-d wrote:
 On Wednesday, 2 July 2014 at 21:45:41 UTC, Walter Bright wrote:
 On 7/2/2014 5:24 AM, Ola Fosheim Grøstad
 ola.fosheim.grostad+dl...@gmail.com wrote:
 D is not even production ready,
 
 Of course it is.
 
 Not by my definition of production ready:
[...]
 2. Outstanding significant issues in the bug tracker.
[...]

I find this particular statement rather amusing. At my day job I work
with enterprise software, which is currently running on dedicated
hardware sold to major corporate customers worldwide. To say that the
state of the bug tracker barely even begins to approach the state of D's
bugtracker, would be the understatement of the century. We have so many
outstanding bugs, ranging from minor to subtle-but-nasty to major design
problems, that the PTBs have given up on trying to rein in the bug
count, and have resorted to measures like closing bugs due to
inactivity. The number of outstanding significant issues that get
postponed past releases due to lack of resources, is enough to send
chills down one's back, if he has any sense of pride in his work at all.
Yet this bug-ridden software was deemed production ready (whatever
that means), and is in fact running in mission-critical services on
customer sites.

By comparison, the state of D's bug tracker looks a lot more promising.


T

-- 
Political correctness: socially-sanctioned hypocrisy.


Re: std.math performance (SSE vs. real)

2014-07-03 Thread Walter Bright via Digitalmars-d
On 7/3/2014 2:43 PM, Ola Fosheim Grøstad 
ola.fosheim.grostad+dl...@gmail.com wrote:

Would you use D for building software to ship with hardware appliances?


Yes.



I would not.


The issues you presented are subjective and a matter of opinion. Regardless of 
the state of D, I'm not the type who wilts at an issue or two - I work around 
it. And so does everyone else who does production work.


If you sit around waiting for arbitrary perfection, you'll never get any work 
done. I don't care that my truck has dings in it, either, it's a truck and it's 
useful for what I need it for :-)


Re: std.math performance (SSE vs. real)

2014-07-03 Thread Walter Bright via Digitalmars-d

On 7/3/2014 1:30 PM, Tofu Ninja wrote:

On Thursday, 3 July 2014 at 19:47:32 UTC, Walter Bright wrote:

On 7/3/2014 8:36 AM, Sean Kelly wrote:

Per the D spec, 'real' will be the longest type supported by the native
hardware.


It's not necessary that real be long double - but it is necessary that long
double be callable from D.

Case in point: long double on Win64 is accessible with D's double, but D
also supports 80 bit real.


That makes it seem like we are compatible by accident rather than by design.


??

I see nothing wrong with it, and it was on purpose.


Re: std.math performance (SSE vs. real)

2014-07-02 Thread Iain Buclaw via Digitalmars-d
On 1 July 2014 20:36, via Digitalmars-d digitalmars-d@puremagic.com wrote:
 On Tuesday, 1 July 2014 at 16:58:55 UTC, Walter Bright wrote:

 Click on compiling for strict IEEE conformance


 It also states that compliance affect performance.


 not IEEE754 compliant. VPF is almost compliant, but does not support
 subnormal
 numbers and flush them to zero. Which can be a disaster…


 It wouldn't be any different if the D spec says floating point is, ya
 know, whatevah. You can't fix stuff like this in the spec.


 Well, the difference is that you can make VPF mostly compliant, but that
 means you trap subnormal numbers and fix it in software. Which affects
 performance.

 If the specs require IEEE754 compliance then you default to software
 emulation and have to turn it off through compiler switches.

 Here is another example: the parallella Coprocessor from Adapteva:

 «The CPU is compatible with the IEEE-754 single-precision format, with the
 following
 exceptions:
 - No support for inexact flags.
 - NAN inputs generate an invalid exception and return a quiet NAN. When one
 or both of the
 inputs are NANs, the sign bit of the operation is set as an XOR of the signs
 of the input sign
 bits.
 - Denormal operands are flushed to zero when input to a computation unit and
 do not generate
 an underflow exception. Any denormal or underflow result from an arithmetic
 operation is
 flushed to zero and an underflow exception is generated.
 - Round-to-±infinity is not supported.»


The crucial thing here is that the layout of float/double types are
IEEE 754 are compatible. :)

These behaviours you describe only affect the FP control functions in
std.math, which are the only thing platform specific, and can only be
written in inline assembly anyway...

Regards
Iain



Re: std.math performance (SSE vs. real)

2014-07-02 Thread Don via Digitalmars-d

On Tuesday, 1 July 2014 at 17:00:30 UTC, Walter Bright wrote:

On 7/1/2014 3:26 AM, Don wrote:
Yes, it's complicated. The interesting thing is that there are 
no 128 bit
registers. The temporaries exist only while the FMA operation 
is in progress.
You cannot even preserve them between consecutive FMA 
operations.


An important consequence is that allowing intermediate 
calculations to be
performed at higher precision than the operands, is crucial, 
and applies outside

of x86. This is something we've got right.

But it's not possible to say that the intermediate 
calculations are done at the
precision of 'real'. This is the semantics which I think we 
currently have

wrong. Our model is too simplistic.

On modern x86, calculations on float operands may have 
intermediate calculations
done at only 32 bits (if using straight SSE), 80 bits (if 
using x87), or 64 bits
(if using float FMA). And for double operands, they may be 64 
bits, 80 bits, or

128 bits.
Yet, in the FMA case, non-FMA operations will be performed at 
lower precision.
It's entirely possible for all three intermediate precisions 
to be active at the

same time!

I'm not sure that we need to change anything WRT code 
generation. But I think
our style recommendations aren't quite right. And we have at 
least one missing

primitive operation (discard all excess precision).


What do you recommend?


It needs some thought. But some things are clear.

Definitely, discarding excess precision is a crucial operation. C 
and C++ tried to do it implicitly with sequence points, but 
that kills optimisation possibilities so much that compilers 
don't respect it. I think it's actually quite similar to write 
barriers in multithreaded programming. C got it wrong, but we're 
currently in an even worse situation because it doesn't 
necessarily happen at all.


We need a builtin operation -- and not in std.math, this is as 
crucial as addition, and it's purely a signal to the optimiser. 
It's very similar to a casting operation. I wonder if we can do 
it as an attribute?  .exact_float, .restrict_float, .force_float, 
.spill_float or something similar?


With D's current floating point semantics, it's actually 
impossible to write correct floating-point code. Everything that 
works right now, is technically only working by accident.


But if we get this right, we can have very nice semantics for 
when things like FMA are allowed to happen -- essentially the 
optimiser would have free reign between these explicit 
discard_excess_precision sequence points.




After that, I'm a bit less sure. It does seem to me that we're 
trying to make 'real' do double-duty as meaning both x87 80 bit 
floating-point number and also as something like a storage class 
that is specific to double: compiler, don't discard excess 
precision. Which are both useful concepts, but aren't identical. 
The two concepts did coincide on x86 32-bit, but they're 
different on x86-64. I think we need to distinguish the two.


Ideally, I think we'd have a __real80 type. On x86 32 bit this 
would be the same as 'real', while on x86-64 __real80 would be 
available but probably 'real' would alias to double. But I'm a 
lot less certain about this.


Re: std.math performance (SSE vs. real)

2014-07-02 Thread Iain Buclaw via Digitalmars-d
On 2 July 2014 09:53, Don via Digitalmars-d digitalmars-d@puremagic.com wrote:
 On Tuesday, 1 July 2014 at 17:00:30 UTC, Walter Bright wrote:

 On 7/1/2014 3:26 AM, Don wrote:

 Yes, it's complicated. The interesting thing is that there are no 128 bit
 registers. The temporaries exist only while the FMA operation is in
 progress.
 You cannot even preserve them between consecutive FMA operations.

 An important consequence is that allowing intermediate calculations to be
 performed at higher precision than the operands, is crucial, and applies
 outside
 of x86. This is something we've got right.

 But it's not possible to say that the intermediate calculations are done
 at the
 precision of 'real'. This is the semantics which I think we currently
 have
 wrong. Our model is too simplistic.

 On modern x86, calculations on float operands may have intermediate
 calculations
 done at only 32 bits (if using straight SSE), 80 bits (if using x87), or
 64 bits
 (if using float FMA). And for double operands, they may be 64 bits, 80
 bits, or
 128 bits.
 Yet, in the FMA case, non-FMA operations will be performed at lower
 precision.
 It's entirely possible for all three intermediate precisions to be active
 at the
 same time!

 I'm not sure that we need to change anything WRT code generation. But I
 think
 our style recommendations aren't quite right. And we have at least one
 missing
 primitive operation (discard all excess precision).


 What do you recommend?


 It needs some thought. But some things are clear.

 Definitely, discarding excess precision is a crucial operation. C and C++
 tried to do it implicitly with sequence points, but that kills
 optimisation possibilities so much that compilers don't respect it. I think
 it's actually quite similar to write barriers in multithreaded programming.
 C got it wrong, but we're currently in an even worse situation because it
 doesn't necessarily happen at all.

 We need a builtin operation -- and not in std.math, this is as crucial as
 addition, and it's purely a signal to the optimiser. It's very similar to a
 casting operation. I wonder if we can do it as an attribute?  .exact_float,
 .restrict_float, .force_float, .spill_float or something similar?

 With D's current floating point semantics, it's actually impossible to write
 correct floating-point code. Everything that works right now, is technically
 only working by accident.

 But if we get this right, we can have very nice semantics for when things
 like FMA are allowed to happen -- essentially the optimiser would have free
 reign between these explicit discard_excess_precision sequence points.


Fixing this is the goal I assume. :)

---
import std.stdio;

void test(double x, double y)
{
  double y2 = x + 1.0;
  if (y != y2) writeln(error);   // Prints 'error' under -O2
}

void main()
{
  immutable double x = .012;  // Removing 'immutable' and it works.
  double y = x + 1.0;

  test(x, y);
}
---



 After that, I'm a bit less sure. It does seem to me that we're trying to
 make 'real' do double-duty as meaning both x87 80 bit floating-point
 number and also as something like a storage class that is specific to
 double: compiler, don't discard excess precision. Which are both useful
 concepts, but aren't identical. The two concepts did coincide on x86 32-bit,
 but they're different on x86-64. I think we need to distinguish the two.

 Ideally, I think we'd have a __real80 type. On x86 32 bit this would be the
 same as 'real', while on x86-64 __real80 would be available but probably
 'real' would alias to double. But I'm a lot less certain about this.

There are flags for that in gdc:

-mlong-double-64
-mlong-double-80
-mlong-double-128


Re: std.math performance (SSE vs. real)

2014-07-02 Thread via Digitalmars-d
On Wednesday, 2 July 2014 at 08:52:25 UTC, Iain Buclaw via 
Digitalmars-d wrote:
The crucial thing here is that the layout of float/double types 
are

IEEE 754 are compatible. :)


That's nice of course, if you import/export, but hardly the only 
crucial thing.


Implied correctness and warnings when assumptions break is also 
important…


These behaviours you describe only affect the FP control 
functions in
std.math, which are the only thing platform specific, and can 
only be

written in inline assembly anyway...


It affects the backend.
It affects vectorization. (NEON is not IEEE754 AFAIK)
It affects what a conforming D compiler is allowed to do.
It affects versioning.

E.g. you can have a flags IEEE754_STRICT or IEE754_HAS_NAN etc 
and use versioning that dectects the wrong compiler-mode.


Re: std.math performance (SSE vs. real)

2014-07-02 Thread Wanderer via Digitalmars-d
On Tuesday, 1 July 2014 at 19:36:26 UTC, Ola Fosheim Grøstad 
wrote:
Besides, Java and Javascript, for example, both require IEEE 
conformance.


But they aren't system level programming languages… and we 
probably cannot expect future many-core processors or 
transputer-like processors to waste die space in order to 
conform.


So it's okay for system level programming languages to produce 
numeric garbage when it comes to floating points? ;-)


Sorry, couldn't resist. Some people keep claiming that D is a 
system level programming language despite there is no single OS 
and no single hardware driver written in D yet. Which sorta puts 
D and Java into the same boat. Besides - gasp! - Java *is* a 
system level programming language after all. There are 
platforms/devices which support Java bytecode natively. For 
system programming, it's extra important that the same algorithm 
produces exactly the same results on different environments. And 
the speed is not always the most important factor.


Re: std.math performance (SSE vs. real)

2014-07-02 Thread via Digitalmars-d

On Wednesday, 2 July 2014 at 12:16:18 UTC, Wanderer wrote:
So it's okay for system level programming languages to 
produce numeric garbage when it comes to floating points? ;-)


System level programming languages provide direct easy access to 
the underlying hardware foundation.


Sorry, couldn't resist. Some people keep claiming that D is a 
system level programming language despite there is no single 
OS and no single hardware driver written in D yet.


D is not even production ready, so why should there be? Who in 
their right mind would use a language in limbo for building a 
serious operating system or do embedded work? You need language 
stability and compiler maturity first.




Re: std.math performance (SSE vs. real)

2014-07-02 Thread Iain Buclaw via Digitalmars-d
On 2 July 2014 12:42, via Digitalmars-d digitalmars-d@puremagic.com wrote:
 On Wednesday, 2 July 2014 at 08:52:25 UTC, Iain Buclaw via Digitalmars-d
 wrote:

 The crucial thing here is that the layout of float/double types are
 IEEE 754 are compatible. :)


 That's nice of course, if you import/export, but hardly the only crucial
 thing.

 Implied correctness and warnings when assumptions break is also important…


 These behaviours you describe only affect the FP control functions in
 std.math, which are the only thing platform specific, and can only be
 written in inline assembly anyway...


 It affects the backend.

Only matters if you have to implement it in your backend

 It affects vectorization. (NEON is not IEEE754 AFAIK)

Vectors are treated differently from floats

 It affects what a conforming D compiler is allowed to do.

That depends what you mean be 'conforming'.

 It affects versioning.

 E.g. you can have a flags IEEE754_STRICT or IEE754_HAS_NAN etc and use
 versioning that dectects the wrong compiler-mode.

Affects only library maintainers, but I haven't looked too much into
what gcc offers as a platform regarding this.

The ARM market is terrible, and it will certainly be the case that we
*can't* have a one size fits all solution.  But in the standard
libraries we can certainly keep strictly in line with the most
conforming chips, so if you wish to support X you may do so in a
platform-specific fork.

This is certainly not unusual for druntime (eg: minilibd)

Regards
Iain



Re: std.math performance (SSE vs. real)

2014-07-02 Thread via Digitalmars-d
On Wednesday, 2 July 2014 at 16:03:47 UTC, Iain Buclaw via 
Digitalmars-d wrote:


Only matters if you have to implement it in your backend


You have to implement it in the backend if D requires strict 
IEEE754 conformance?



Vectors are treated differently from floats


How can you then let the compiler vectorize? You can't. Meaning, 
your code will run very slow.



It affects versioning.

E.g. you can have a flags IEEE754_STRICT or IEE754_HAS_NAN etc 
and use

versioning that dectects the wrong compiler-mode.


Affects only library maintainers, but I haven't looked too much 
into

what gcc offers as a platform regarding this.


I don't agree. If your code produce denormal numbers then it 
matters a lot if they are forced to zero or not. Just think about 
divison by zero traps. Why would this only be a library issue?


If you write portable code you shouldn't have to second guess 
what the compiler does. It either guarantees that denormal 
numbers are not flushed to zero, or it does not. If it does not 
then D does not require IEEE754 and you will have to think about 
this when you write your code.


The ARM market is terrible, and it will certainly be the case 
that we

*can't* have a one size fits all solution.  But in the standard
libraries we can certainly keep strictly in line with the most
conforming chips, so if you wish to support X you may do so in a
platform-specific fork.


I don't really understand the reasoning here. Is D Intel x86 
specific? Meaning, it is a system level programming language on 
x86 only and something arbitrary on other platforms?


Either D requires IEEE754 strict mode, or it does not. It matters 
what the default is.


Re: std.math performance (SSE vs. real)

2014-07-02 Thread Walter Bright via Digitalmars-d

On 7/2/2014 1:53 AM, Don wrote:

Definitely, discarding excess precision is a crucial operation. C and C++ tried
to do it implicitly with sequence points, but that kills optimisation
possibilities so much that compilers don't respect it. I think it's actually
quite similar to write barriers in multithreaded programming. C got it wrong,
but we're currently in an even worse situation because it doesn't necessarily
happen at all.

We need a builtin operation -- and not in std.math, this is as crucial as
addition, and it's purely a signal to the optimiser. It's very similar to a
casting operation. I wonder if we can do it as an attribute?  .exact_float,
.restrict_float, .force_float, .spill_float or something similar?

With D's current floating point semantics, it's actually impossible to write
correct floating-point code. Everything that works right now, is technically
only working by accident.

But if we get this right, we can have very nice semantics for when things like
FMA are allowed to happen -- essentially the optimiser would have free reign
between these explicit discard_excess_precision sequence points.


This is easily handled without language changes by putting a couple builtin 
functions in druntime - roundToFloat() and roundToDouble().




Ideally, I think we'd have a __real80 type. On x86 32 bit this would be the same
as 'real', while on x86-64 __real80 would be available but probably 'real' would
alias to double. But I'm a lot less certain about this.


I'm afraid that would not only break most D programs, but also interoperability 
with C.


Re: std.math performance (SSE vs. real)

2014-07-02 Thread Iain Buclaw via Digitalmars-d
On 2 July 2014 19:58, via Digitalmars-d digitalmars-d@puremagic.com wrote:
 On Wednesday, 2 July 2014 at 16:03:47 UTC, Iain Buclaw via Digitalmars-d
 wrote:


 Only matters if you have to implement it in your backend


 You have to implement it in the backend if D requires strict IEEE754
 conformance?


No, you don't.  At least I just let the gcc backend take care of
whatever behaviours occur.  Which tend to be based around C as a
baseline.


 Vectors are treated differently from floats


 How can you then let the compiler vectorize? You can't. Meaning, your code
 will run very slow.


Easily - it does this for you so long as it determines that it is beneficial.

 The ARM market is terrible, and it will certainly be the case that we
 *can't* have a one size fits all solution.  But in the standard
 libraries we can certainly keep strictly in line with the most
 conforming chips, so if you wish to support X you may do so in a
 platform-specific fork.


 I don't really understand the reasoning here. Is D Intel x86 specific?

Yes it is, more than you might realise.  I've been spending the last 4
years breaking it to be platform agnostic. :o)


Regards
Iain


Re: std.math performance (SSE vs. real)

2014-07-02 Thread Sean Kelly via Digitalmars-d

On Wednesday, 2 July 2014 at 20:37:37 UTC, Walter Bright wrote:

On 7/2/2014 1:53 AM, Don wrote:


Ideally, I think we'd have a __real80 type. On x86 32 bit this 
would be the same as 'real', while on x86-64 __real80 would be 
available but probably 'real' would alias to double. But I'm a 
lot less certain about this.


I'm afraid that would not only break most D programs, but also 
interoperability with C.


Could you explain this?  I didn't think we used 'real' to
interface with C at all.  We might need a type to match 'long
double' in C, but what that is is already exceedingly variable.
This would probably be another case for a special alias like we
have for c_long.


Re: std.math performance (SSE vs. real)

2014-07-02 Thread Iain Buclaw via Digitalmars-d
On 2 July 2014 21:37, Walter Bright via Digitalmars-d
digitalmars-d@puremagic.com wrote:
 On 7/2/2014 1:53 AM, Don wrote:

 Definitely, discarding excess precision is a crucial operation. C and C++
 tried
 to do it implicitly with sequence points, but that kills optimisation
 possibilities so much that compilers don't respect it. I think it's
 actually
 quite similar to write barriers in multithreaded programming. C got it
 wrong,
 but we're currently in an even worse situation because it doesn't
 necessarily
 happen at all.

 We need a builtin operation -- and not in std.math, this is as crucial as
 addition, and it's purely a signal to the optimiser. It's very similar to
 a
 casting operation. I wonder if we can do it as an attribute?
 .exact_float,
 .restrict_float, .force_float, .spill_float or something similar?

 With D's current floating point semantics, it's actually impossible to
 write
 correct floating-point code. Everything that works right now, is
 technically
 only working by accident.

 But if we get this right, we can have very nice semantics for when things
 like
 FMA are allowed to happen -- essentially the optimiser would have free
 reign
 between these explicit discard_excess_precision sequence points.


 This is easily handled without language changes by putting a couple builtin
 functions in druntime - roundToFloat() and roundToDouble().



 Ideally, I think we'd have a __real80 type. On x86 32 bit this would be
 the same
 as 'real', while on x86-64 __real80 would be available but probably 'real'
 would
 alias to double. But I'm a lot less certain about this.


 I'm afraid that would not only break most D programs, but also
 interoperability with C.

I think it could work with a very small selective list of operations.

ie:
- NegExp
- CmpExp
- CallExp to core.math intrinsics.


Regards
Iain.


Re: std.math performance (SSE vs. real)

2014-07-02 Thread Walter Bright via Digitalmars-d

On 7/2/2014 2:33 PM, Sean Kelly wrote:

On Wednesday, 2 July 2014 at 20:37:37 UTC, Walter Bright wrote:

I'm afraid that would not only break most D programs, but also
interoperability with C.


Could you explain this?  I didn't think we used 'real' to
interface with C at all.  We might need a type to match 'long
double' in C, but what that is is already exceedingly variable.
This would probably be another case for a special alias like we
have for c_long.



C long double == D real for 32 and 64 bit OSX, Linux, and FreeBSD.



Re: std.math performance (SSE vs. real)

2014-07-02 Thread Walter Bright via Digitalmars-d
On 7/2/2014 5:24 AM, Ola Fosheim Grøstad 
ola.fosheim.grostad+dl...@gmail.com wrote:

D is not even production ready,


Of course it is.



Re: std.math performance (SSE vs. real)

2014-07-02 Thread Sean Kelly via Digitalmars-d

On Wednesday, 2 July 2014 at 21:44:17 UTC, Walter Bright wrote:

On 7/2/2014 2:33 PM, Sean Kelly wrote:

On Wednesday, 2 July 2014 at 20:37:37 UTC, Walter Bright wrote:

I'm afraid that would not only break most D programs, but also
interoperability with C.


Could you explain this?  I didn't think we used 'real' to
interface with C at all.  We might need a type to match 'long
double' in C, but what that is is already exceedingly variable.
This would probably be another case for a special alias like we
have for c_long.


C long double == D real for 32 and 64 bit OSX, Linux, and 
FreeBSD.


And it's 'double double' on PPC and 128 bit quad on SPARC.
Assuming D targets those platforms, what will be the behavior
there?

 From my perspective, it seems like 'real' in D is utterly
non-portable given its definition.  I can see maybe using it in
some cases if I knew I was targeting a specific architecture
where the added precision was helpful, but for general purpose
programming I'd always either use 'double' or some library-based
type for extended precision, simply to have some assurance that
my result would be predictable.  Am I wrong in this?


Re: std.math performance (SSE vs. real)

2014-07-02 Thread Walter Bright via Digitalmars-d

On 7/2/2014 3:15 PM, Sean Kelly wrote:

On Wednesday, 2 July 2014 at 21:44:17 UTC, Walter Bright wrote:

C long double == D real for 32 and 64 bit OSX, Linux, and FreeBSD.


And it's 'double double' on PPC and 128 bit quad on SPARC.
Assuming D targets those platforms, what will be the behavior
there?


Per the D spec, 'real' will be the longest type supported by the native 
hardware.



  From my perspective, it seems like 'real' in D is utterly
non-portable given its definition.  I can see maybe using it in
some cases if I knew I was targeting a specific architecture
where the added precision was helpful, but for general purpose
programming I'd always either use 'double' or some library-based
type for extended precision, simply to have some assurance that
my result would be predictable.  Am I wrong in this?


D is a systems programming language. That means it should have access to the 
hardware supported types. Portability is not the only goal - especially if that 
means least common denominator. People pay money for more powerful chips, and 
they'll want to use them.


Not only that, a marquee feature of D is interoperability with C. We'd need an 
AWFULLY good reason to throw that under the bus.




Re: std.math performance (SSE vs. real)

2014-07-02 Thread Walter Bright via Digitalmars-d

On 7/2/2014 2:28 PM, Iain Buclaw via Digitalmars-d wrote:

On 2 July 2014 19:58, via Digitalmars-d digitalmars-d@puremagic.com wrote:

I don't really understand the reasoning here. Is D Intel x86 specific?

Yes it is, more than you might realise.  I've been spending the last 4
years breaking it to be platform agnostic. :o)


I think you're conflating dmd with D.

And IEEE 754 is a standard.



Re: std.math performance (SSE vs. real)

2014-07-02 Thread H. S. Teoh via Digitalmars-d
On Wed, Jul 02, 2014 at 05:03:47PM -0700, Walter Bright via Digitalmars-d wrote:
[...]
 D is a systems programming language. That means it should have access
 to the hardware supported types. Portability is not the only goal -
 especially if that means least common denominator. People pay money
 for more powerful chips, and they'll want to use them.

What should we do in the case of hardware that offers strange hardware
types, like a hypothetical 48-bit floating point type? Should D offer a
built-in type for that purpose, even if it only exists on a single chip
that's used by 0.01% of the community?


 Not only that, a marquee feature of D is interoperability with C. We'd
 need an AWFULLY good reason to throw that under the bus.

I'm not sure I understand how removing support 80-bit floats hurts
interoperability with C? I thought none of the standard C float types
map to the x87 80-bit float?

(I'm not opposed to keeping real as 80-bit on x87, but I just don't
understand what this has to do with C interoperability.)


T

-- 
In order to understand recursion you must first understand recursion.


Re: std.math performance (SSE vs. real)

2014-07-02 Thread Sean Kelly via Digitalmars-d
On Thursday, 3 July 2014 at 01:13:13 UTC, H. S. Teoh via 
Digitalmars-d wrote:


I'm not sure I understand how removing support 80-bit floats 
hurts interoperability with C? I thought none of the standard C 
float types map to the x87 80-bit float?


The C spec never says anything specific about representation 
because it's meant to target anything, but the x86 and AMD64 ABIs 
basically say that long double is 80-bit for calculations.  The 
x86 spec says that the type is stored in 96 bits though, and the 
AMD64 spec says they're stored in 128 bits for alignment purposes.


I'm still unclear whether we're aiming for C interoperability or 
hardware support though, based on Walter's remark about SPARC and 
PPC.  There, 'long double' is represented differently but is not 
backed by specialized hardware, so I'm guessing D would make 
'real' 64-bits on these platforms and break compatibility with C. 
 So... I guess we really do need a special alias for C 
compatibility, and this can map to whatever intrinsic type the 
applicable compiler supports for that platform.


Re: std.math performance (SSE vs. real)

2014-07-01 Thread via Digitalmars-d

On Monday, 30 June 2014 at 22:58:48 UTC, Walter Bright wrote:
Wow. Fortunately, there's a switch 
http://publib.boulder.ibm.com/infocenter/cellcomp/v101v121/index.jsp?topic=/com.ibm.xlcpp101.cell.doc/proguide/spu_sp_diffs.html 
so it'll work correctly.


That's the same link I provided, but I presume the compiler 
switch kills performance? You have the same with ARM processors. 
NEON (SIMD) instructions are not IEEE754 compliant. VPF is almost 
compliant, but does not support subnormal numbers and flush them 
to zero. Which can be a disaster…


So basically, floating point is not portable unless you give up 
performance or check all expressions with worst case analysis 
based on deficiencies on all current platforms.


Re: std.math performance (SSE vs. real)

2014-07-01 Thread Iain Buclaw via Digitalmars-d
On 1 July 2014 06:34, dennis luehring via Digitalmars-d
digitalmars-d@puremagic.com wrote:
 Am 01.07.2014 00:18, schrieb Andrei Alexandrescu:

 On 6/30/14, 2:20 AM, Don wrote:

 For me, a stronger argument is that you can get *higher* precision using
 doubles, in many cases. The reason is that FMA gives you an intermediate
 value with 128 bits of precision; it's available in SIMD but not on x87.

 So, if we want to use the highest precision supported by the hardware,
 that does *not* mean we should always use 80 bits.

 I've experienced this in CTFE, where the calculations are currently done
 in 80 bits, I've seen cases where the 64-bit runtime results were more
 accurate, because of those 128 bit FMA temporaries. 80 bits are not
 enough!!


 Interesting. Maybe we should follow a simple principle - define
 overloads and intrinsic operations such that real is only used if (a)
 requested explicitly (b) it brings about an actual advantage.


 gcc seems to use GMP for (all) its compiletime calculations - is this for
 cross-compile unification of calculation results or just for better result
 at all - or both?


More cross-compilation where the host has less precision than the
target.  But at the same time they wouldn't use GMP if it didn't
produce accurate results. :)


Re: std.math performance (SSE vs. real)

2014-07-01 Thread Daniel Murphy via Digitalmars-d
dennis luehring  wrote in message news:loth9o$2arl$1...@digitalmars.com... 

gcc seems to use GMP for (all) its compiletime calculations - is this 
for cross-compile unification of calculation results or just for better 
result at all - or both?


To make the gcc build process more complicated.


Re: std.math performance (SSE vs. real)

2014-07-01 Thread Don via Digitalmars-d

On Monday, 30 June 2014 at 16:54:17 UTC, Walter Bright wrote:

On 6/30/2014 12:20 AM, Don wrote:
What I think is highly likely is that it will only have legacy 
support, with
such awful performance that it never makes sense to use them. 
For example, the
speed of 80-bit and 64-bit calculations in x87 used to be 
identical. But on
recent Intel CPUs, the 80-bit operations run at half the speed 
of the 64 bit

operations. They are already partially microcoded.

For me, a stronger argument is that you can get *higher* 
precision using
doubles, in many cases. The reason is that FMA gives you an 
intermediate value
with 128 bits of precision; it's available in SIMD but not on 
x87.


So, if we want to use the highest precision supported by the 
hardware, that does

*not* mean we should always use 80 bits.

I've experienced this in CTFE, where the calculations are 
currently done in 80
bits, I've seen cases where the 64-bit runtime results were 
more accurate,
because of those 128 bit FMA temporaries. 80 bits are not 
enough!!


I did not know this. It certainly adds another layer of nuance 
- as the higher level of precision will only apply as long as 
one can keep the value in a register.


Yes, it's complicated. The interesting thing is that there are no 
128 bit registers. The temporaries exist only while the FMA 
operation is in progress. You cannot even preserve them between 
consecutive FMA operations.


An important consequence is that allowing intermediate 
calculations to be performed at higher precision than the 
operands, is crucial, and applies outside of x86. This is 
something we've got right.


But it's not possible to say that the intermediate calculations 
are done at the precision of 'real'. This is the semantics which 
I think we currently have wrong. Our model is too simplistic.


On modern x86, calculations on float operands may have 
intermediate calculations done at only 32 bits (if using straight 
SSE), 80 bits (if using x87), or 64 bits (if using float FMA). 
And for double operands, they may be 64 bits, 80 bits, or 128 
bits.
Yet, in the FMA case, non-FMA operations will be performed at 
lower precision.
It's entirely possible for all three intermediate precisions to 
be active at the same time!


I'm not sure that we need to change anything WRT code generation. 
But I think our style recommendations aren't quite right. And we 
have at least one missing primitive operation (discard all excess 
precision).





Re: std.math performance (SSE vs. real)

2014-07-01 Thread Walter Bright via Digitalmars-d
On 6/30/2014 11:58 PM, Ola Fosheim Grøstad 
ola.fosheim.grostad+dl...@gmail.com wrote:

On Monday, 30 June 2014 at 22:58:48 UTC, Walter Bright wrote:

Wow. Fortunately, there's a switch
http://publib.boulder.ibm.com/infocenter/cellcomp/v101v121/index.jsp?topic=/com.ibm.xlcpp101.cell.doc/proguide/spu_sp_diffs.html
so it'll work correctly.


That's the same link I provided, but I presume the compiler switch kills
performance?


Click on compiling for strict IEEE conformance



You have the same with ARM processors. NEON (SIMD) instructions are
not IEEE754 compliant. VPF is almost compliant, but does not support subnormal
numbers and flush them to zero. Which can be a disaster…


It wouldn't be any different if the D spec says floating point is, ya know, 
whatevah. You can't fix stuff like this in the spec.




So basically, floating point is not portable unless you give up performance or
check all expressions with worst case analysis based on deficiencies on all
current platforms.


As I've posted before, nobody's FP code is going to work on such platforms out 
of the box even if the spec is accommodating for it. The whole point of IEEE 754 
is to make portable FP code possible.


Besides, Java and Javascript, for example, both require IEEE conformance.


Re: std.math performance (SSE vs. real)

2014-07-01 Thread Walter Bright via Digitalmars-d

On 7/1/2014 3:26 AM, Don wrote:

Yes, it's complicated. The interesting thing is that there are no 128 bit
registers. The temporaries exist only while the FMA operation is in progress.
You cannot even preserve them between consecutive FMA operations.

An important consequence is that allowing intermediate calculations to be
performed at higher precision than the operands, is crucial, and applies outside
of x86. This is something we've got right.

But it's not possible to say that the intermediate calculations are done at the
precision of 'real'. This is the semantics which I think we currently have
wrong. Our model is too simplistic.

On modern x86, calculations on float operands may have intermediate calculations
done at only 32 bits (if using straight SSE), 80 bits (if using x87), or 64 bits
(if using float FMA). And for double operands, they may be 64 bits, 80 bits, or
128 bits.
Yet, in the FMA case, non-FMA operations will be performed at lower precision.
It's entirely possible for all three intermediate precisions to be active at the
same time!

I'm not sure that we need to change anything WRT code generation. But I think
our style recommendations aren't quite right. And we have at least one missing
primitive operation (discard all excess precision).


What do you recommend?



Re: std.math performance (SSE vs. real)

2014-07-01 Thread via Digitalmars-d

On Tuesday, 1 July 2014 at 16:58:55 UTC, Walter Bright wrote:

Click on compiling for strict IEEE conformance


It also states that compliance affect performance.

not IEEE754 compliant. VPF is almost compliant, but does not 
support subnormal

numbers and flush them to zero. Which can be a disaster…


It wouldn't be any different if the D spec says floating point 
is, ya know, whatevah. You can't fix stuff like this in the 
spec.


Well, the difference is that you can make VPF mostly compliant, 
but that means you trap subnormal numbers and fix it in software. 
Which affects performance.


If the specs require IEEE754 compliance then you default to 
software emulation and have to turn it off through compiler 
switches.


Here is another example: the parallella Coprocessor from Adapteva:

«The CPU is compatible with the IEEE-754 single-precision format, 
with the following

exceptions:
- No support for inexact flags.
- NAN inputs generate an invalid exception and return a quiet 
NAN. When one or both of the
inputs are NANs, the sign bit of the operation is set as an XOR 
of the signs of the input sign

bits.
- Denormal operands are flushed to zero when input to a 
computation unit and do not generate
an underflow exception. Any denormal or underflow result from an 
arithmetic operation is

flushed to zero and an underflow exception is generated.
- Round-to-±infinity is not supported.»

Besides, Java and Javascript, for example, both require IEEE 
conformance.


But they aren't system level programming languages… and we 
probably cannot expect future many-core processors or 
transputer-like processors to waste die space in order to conform.


So sure you can specify the IEEE-754 spec and just make D run at 
full rate on typical CISC CPUs, but the alternative is to 
constrain the promise of compliance to what is typical for 
efficient CPUs. Then have a -strict flag for the few 
applications that are scientific in nature. That would be more in 
line with system level programming.




Re: std.math performance (SSE vs. real)

2014-06-30 Thread Walter Bright via Digitalmars-d

On 6/29/2014 9:38 PM, Manu via Digitalmars-d wrote:

It's news to me that x86, x86-64, etc., are deprecated, despite being used
to run pretty much all desktops and laptops and even servers. The 80 bit
reals are also part of the C ABI for Linux, OSX, and FreeBSD, 32 and 64 bit.


x86_64 and x86 are different architectures, and they have very different ABI's.
Nobody is manufacturing x86 (exclusive) cpu's.
Current x86_64 cpu's maintain a backwards compatibility mode, but
that's not a part of the x86-64 spec, and may go away when x86_64 is
deemed sufficiently pervasive and x86 sufficiently redundant.


It's still part of the C ABI for both 32 and 64 bit code.



Correct, so they are deliberately treated separately.
I argued for strong separation between simd and float, and you agreed.


floats  doubles are implemented using SIMD instructions.



Since they are part of the 64 bit C ABI, that would seem to be in the
category of nevah hoppen.

Not in windows.


Correct.



You say they are in linux? I don't know.


Since you don't believe me, I recommend looking it up. The document is entitled 
System V Application Binary Interface AMD64 Architecture Processor Supplement


Furthermore, just try using long double on Linux, and disassemble the 
resulting code.




How do you distinguish x87 double and xmm double in C?


You don't. It's a compiler implementation issue.



The only way I know to access x87 is with inline asm.


I suggest using long double on Linux and look at the compiler output. You 
don't have to believe me - use gcc or clang.




Huh? I think you misunderstood my point. I'm saying that fpu/simd
units are distinct, and they are distanced by the type system in order
to respect that separation.


I think that's not correct. There's nothing in the C Standard that says you have 
to implement float semantics with any particular FPU, nor does the C type system 
distinguish FPUs.




Re: std.math performance (SSE vs. real)

2014-06-30 Thread Don via Digitalmars-d

On Monday, 30 June 2014 at 04:15:46 UTC, Walter Bright wrote:

On 6/29/2014 8:22 PM, Manu via Digitalmars-d wrote:
Well, here's the thing then. Consider that 'real' is only 
actually

supported on only a single (long deprecated!) architecture.


In x64's case, it is deprecated for over a decade now, and may 
be
removed from the hardware at some unknown time. The moment 
that x64
processors decide to stop supporting 32bit code, the x87 will 
go away,

and those opcodes will likely be emulated or microcoded.
Interacting real-float/double means register swapping through
memory. It should be treated the same as float-simd; they are
distinct (on most arch's).


Since they are part of the 64 bit C ABI, that would seem to be 
in the category of nevah hoppen.


What I think is highly likely is that it will only have legacy 
support, with such awful performance that it never makes sense to 
use them. For example, the speed of 80-bit and 64-bit 
calculations in x87 used to be identical. But on recent Intel 
CPUs, the 80-bit operations run at half the speed of the 64 bit 
operations. They are already partially microcoded.


For me, a stronger argument is that you can get *higher* 
precision using doubles, in many cases. The reason is that FMA 
gives you an intermediate value with 128 bits of precision; it's 
available in SIMD but not on x87.


So, if we want to use the highest precision supported by the 
hardware, that does *not* mean we should always use 80 bits.


I've experienced this in CTFE, where the calculations are 
currently done in 80 bits, I've seen cases where the 64-bit 
runtime results were more accurate, because of those 128 bit FMA 
temporaries. 80 bits are not enough!!




Re: std.math performance (SSE vs. real)

2014-06-30 Thread ed via Digitalmars-d

On Monday, 30 June 2014 at 06:21:49 UTC, Walter Bright wrote:

When precision is an issue we always choose a software solution. 
This has been my experience in both geophysics and medical device 
development. It is cheaper, faster (dev. time), and better tested 
than anything we would develop within a release time frame.


But D real is a winner IMO. At my last workplace we ported some 
geophysics C++ apps to D for fun. The apps required more 
precision than double could offer and relied on GMP/MPFR. It was 
a nice surprise when we found the extra bits in D's real were 
enough for some of these apps to be correct without GMP/MPFR and 
gave a real performance boost (pun intended!).


We targeted x86/x86_64 desktops and clusters running linux 
(windows and MAC on desktops as well).


We did not consider the lack of IBM 360 support to be an issue 
when porting to D :-P



Cheers,
ed




Re: std.math performance (SSE vs. real)

2014-06-30 Thread ed via Digitalmars-d

On Monday, 30 June 2014 at 07:21:00 UTC, Don wrote:

On Monday, 30 June 2014 at 04:15:46 UTC, Walter Bright wrote:

On 6/29/2014 8:22 PM, Manu via Digitalmars-d wrote:
Well, here's the thing then. Consider that 'real' is only 
actually

supported on only a single (long deprecated!) architecture.


In x64's case, it is deprecated for over a decade now, and 
may be
removed from the hardware at some unknown time. The moment 
that x64
processors decide to stop supporting 32bit code, the x87 will 
go away,

and those opcodes will likely be emulated or microcoded.
Interacting real-float/double means register swapping 
through
memory. It should be treated the same as float-simd; they 
are

distinct (on most arch's).


Since they are part of the 64 bit C ABI, that would seem to be 
in the category of nevah hoppen.


What I think is highly likely is that it will only have legacy 
support, with such awful performance that it never makes sense 
to use them. For example, the speed of 80-bit and 64-bit 
calculations in x87 used to be identical. But on recent Intel 
CPUs, the 80-bit operations run at half the speed of the 64 bit 
operations. They are already partially microcoded.


For me, a stronger argument is that you can get *higher* 
precision using doubles, in many cases. The reason is that FMA 
gives you an intermediate value with 128 bits of precision; 
it's available in SIMD but not on x87.


So, if we want to use the highest precision supported by the 
hardware, that does *not* mean we should always use 80 bits.


I've experienced this in CTFE, where the calculations are 
currently done in 80 bits, I've seen cases where the 64-bit 
runtime results were more accurate, because of those 128 bit 
FMA temporaries. 80 bits are not enough!!


This is correct and we use this now for some time critical code 
that requires high precision.


But anything non-time critical (~80%-85% of our code) we simply 
use a software solution when precision becomes an issue. It is 
here that I think the extra bits in D real can be enough to get a 
performance gain.


But I won't argue with you think I'm wrong. I'm only basing this 
on anecdotal evidence of what I saw from 5-6 apps ported from C++ 
to D :-)


Cheers,
ed



Re: std.math performance (SSE vs. real)

2014-06-30 Thread via Digitalmars-d

On Sunday, 29 June 2014 at 22:49:44 UTC, Walter Bright wrote:
I guess we just hope that all future hardware is IEEE754 
compliant.


I'm not concerned about it. No CPU maker in their right head 
would do something different.


AFAIK they break compliance all the time.


Re: std.math performance (SSE vs. real)

2014-06-30 Thread Don via Digitalmars-d
On Sunday, 29 June 2014 at 18:13:59 UTC, Russel Winder via 
Digitalmars-d wrote:
On Sun, 2014-06-29 at 07:59 -0700, Andrei Alexandrescu via 
Digitalmars-d

wrote:
[…]

A friend who works at a hedge fund (after making the rounds to 
the NYC large financial companies) told me that's a myth. Any 
nontrivial calculation involving money (interest, fixed 
income, derivatives, ...) needs floating point. He never 
needed more than double.


Very definitely so. Fixed point or integer arithmetic for simple
household finance fair enough, but for finance house 
calculations
you generally need 22+ significant denary digits to meet with 
compliance

requirements.


Many people seem to have the bizarre idea that floating point is 
less accurate than integer arithmetic. As if storing a value into 
a double makes it instantly fuzzy, or something.
In fact, providing that the the precision is large enough, every 
operation that is exact in integers, is exact in floating point 
as well.
And if you perform a division using integers, you've silently 
lost precision.
So I'm not sure what benefit you'd gain by eschewing floating 
point.






Re: std.math performance (SSE vs. real)

2014-06-30 Thread via Digitalmars-d

On Monday, 30 June 2014 at 11:57:04 UTC, Don wrote:
And if you perform a division using integers, you've silently 
lost precision.


2 ints of arbitrary length = rational numbers = no loss of 
precision for divs.


CPU vendors make arbitrary decisions about FP and break 
compliance with no remorse for single precision float vector 
operations in order to reduce die size / increase throughput. 
That includes not having NaN/Inf, reducing mantissa precision for 
some operations, etc.


FP is not portable out-of-the-box.

I think the main advantage of integers is that you control the 
precision and can repeat the calculation with the same result. It 
is easier to avoid stability issues with integers too. And it is 
portable.


Re: std.math performance (SSE vs. real)

2014-06-30 Thread H. S. Teoh via Digitalmars-d
On Sun, Jun 29, 2014 at 11:33:20PM +0100, Iain Buclaw via Digitalmars-d wrote:
 On 29 June 2014 23:20, H. S. Teoh via Digitalmars-d
 digitalmars-d@puremagic.com wrote:
  On Sun, Jun 29, 2014 at 08:54:49AM +0100, Iain Buclaw via Digitalmars-d 
  wrote:
  On 29 Jun 2014 05:48, H. S. Teoh via Digitalmars-d 
  digitalmars-d@puremagic.com wrote:
  
   On Sat, Jun 28, 2014 at 08:41:24PM -0700, Andrei Alexandrescu via
  Digitalmars-d wrote:
On 6/28/14, 6:02 PM, Tofu Ninja wrote:
   [...]
I think this thread needs to refocus on the main point,
getting math overloads for float and double and how to
mitigate any problems that might arise from that.
   
Yes please. -- Andrei
  
   Let's see the PR!
  
 
  I've already raised one (already linked in this thread).
 
  Are you talking about #2274? Interesting that your implementation is
  basically identical to my own idea for fixing std.math -- using
  unions instead of pointer casting.
 
 
 Not really.  The biggest speed up was from adding float+double
 overloads for floor, ceil, isNaN and isInfinity.  Firstly, the use of
 a union itself didn't make much of a dent in the speed up.  Removing
 the slow array copy operation did though.  Secondly, unions are
 required for this particular function (floor) because we need to set
 bits through type-punning, it just wouldn't work casting to a pointer.
[...]

I wasn't referring to the speedup (though that is certainly nice), I was
talking about making things CTFE-able.

What's the status of repainting unions in CTFE? Is there a PR for that
yet, or do we need to implement one?


T

-- 
People tell me that I'm skeptical, but I don't believe it.


Re: std.math performance (SSE vs. real)

2014-06-30 Thread dennis luehring via Digitalmars-d

Am 30.06.2014 18:30, schrieb dennis luehring:

Am 30.06.2014 08:21, schrieb Walter Bright:

The only way I know to access x87 is with inline asm.


I suggest using long double on Linux and look at the compiler output. You
don't have to believe me - use gcc or clang.


gcc.godbolt.org clang 3.4.1 -O3


better this

int main(int argc, char** argv)
{
  return argc * 12345.6789L;
}

.LCPI0_0:
# x86_fp80 12345.67889996
.quad   -4546745350290602879

.short  16396
.zero   6
main:   # @main
movl%edi, -8(%rsp)
fldt.LCPI0_0(%rip)
fimull  -8(%rsp)
fnstcw  -10(%rsp)
movw-10(%rsp), %ax
movw$3199, -10(%rsp)# imm = 0xC7F
fldcw   -10(%rsp)
movw%ax, -10(%rsp)
fistpl  -4(%rsp)
fldcw   -10(%rsp)
movl-4(%rsp), %eax
ret



  1   2   3   >