digitalmars.D - SSE, AVX, and beyond
- Eljay (11/11) Aug 09 2009 As cent/ucent, should a keyword be reserved for 256? 512? 1024?
- bearophile (16/17) Aug 09 2009 Today a CPU can perform an operation like ucent & ucent using the single...
- Robert Fraser (7/16) Aug 10 2009 Is there ANY use case where you'd need a 256-bit integer instead of a
- Mattias Holm (18/26) Aug 20 2009 Fixed point arithmetic!!!
As cent/ucent, should a keyword be reserved for 256? 512? 1024? - - - - - - - - - - - - - - - Most programming languages are loathe to add new keywords, because that has the chance to impact existing code. So the time to add keywords for D 2.0(alpha) is now, since the language is in alpha. For 128-bit signed/unsigned int, D has reserved cent and ucent. Perfect for working with UUIDs. But not implemented yet. The next generation of SSE, called AVX, will support 256-bit data. Now, granted, those 256-bit registers and data-path is more like (u)byte[32], or (u)short[16], or (u)int[8], or float[8] arrays with specially optimized SIMD instructions. The current generation of GPUs support 256-bit data. Some of which may be used for GPGPU work. (D Programming Language does not target those GPGPUs, yet. But with a little luck...) It is within the realm of reason that there may be larger-than-64-bit integers in the near future. 128 is ready, with cent/ucent. Should larger sizes have reserved keywords? Or are those larger sizes just too ludicrously large to worry about? Or maybe a language extension like int!256, int!512, int!1024 (and retrofit to int!128, int!64, int!32, int!16, int!8 ... much as MSVC++ has __int64, __int32, __int16, __int8, or FORTRAN has integer*8, integer*4, integer*2, integer*1). Thoughts? [My FORTRAN is very, very rusty, so my apologies if I misremembered.]
Aug 09 2009
Eljay:Should larger sizes have reserved keywords? Or are those larger sizes just too ludicrously large to worry about?<Today a CPU can perform an operation like ucent & ucent using the single SSE2 instruction PAND (_mm_and_si128 on GCC). A 128 bit unsigned number may look of little use if you see it as an integer value, but it can be very useful if you see it like an array of bits that can be modified with operations that work in parallel on many bits. Such very wide bitwise operations are useful in many situations, for example to compute possible moves in a program that plays chess, to find approximate genomic substrings using a fast finite state machine, to quickly perform set operations on bit vectors and bloom filters, etc. Adding other type names for values longer than cent/ucent doesn't look useful. In my opinion it's much better if the D compiler is able to translate operations like: float[4] v1, v2, v3; uint[4] a1, a2, a3; v3[] = v1[] + v2[]; a3[] = a1[] & a2[]; In single inlined SSE1/2/3+ instructions, and float[8] v1, v2, v3; uint[8] a1, a2, a3; v3[] = v1[] + v2[]; a3[] = a1[] & a2[]; In inlined pairs of istructions, and so on. LDC is supposed to be able to do this, but currently it's not able to (also today those v1, v2, etc on the stack have to be aligned to 16 bytes). Bye, bearophile
Aug 09 2009
Eljay wrote:As cent/ucent, should a keyword be reserved for 256? 512? 1024? - - - - - - - - - - - - - - - Most programming languages are loathe to add new keywords, because that has the chance to impact existing code. So the time to add keywords for D 2.0(alpha) is now, since the language is in alpha. For 128-bit signed/unsigned int, D has reserved cent and ucent. Perfect for working with UUIDs. But not implemented yet.Is there ANY use case where you'd need a 256-bit integer instead of a BigInteger? Even 128 is a bit dodgy. UUIDs and what not are identifiers, not numbers, so have no problem being stored in a struct wrapping a ubyte[]. I agree compilers should support 256+ bit _data_... But doing so with an entirely new numeric data-type is probably a bad idea. Special treatment for certain constructs and library support is a much better idea.
Aug 10 2009
Robert Fraser wrote:Eljay wrote: Is there ANY use case where you'd need a 256-bit integer instead of a BigInteger? Even 128 is a bit dodgy. UUIDs and what not are identifiers, not numbers, so have no problem being stored in a struct wrapping a ubyte[].Fixed point arithmetic!!! Seriously, 256 bit fixed point numbers (roughly an integer, but with renormalization after multiplication and division) can represent the position of anything in the visible universe at a smaller scale than the plank length (which physically does not make any sense). I would find that pretty nice to work with, actually, it would be a lot nicer than doubles.I agree compilers should support 256+ bit _data_... But doing so with an entirely new numeric data-type is probably a bad idea. Special treatment for certain constructs and library support is a much better idea.I don't get this, I am doing research in compiler optimizations, and I can say that library supported value types are just painful to reason about since they are not part of the language, they end up as being not properly formalized, and the compiler will lose optimization opportunities. It makes more sense to declare some growth opportunity for the future, and then add new types (with new keywords) in future language revisions (which should be enabled by flags, this does complicate the parser a little bit, but it does not have to overly complicated in a handwritten parser. / Mattias
Aug 20 2009