Hi Some random thoughts.
I think if we add new functions to the mpz layer , however it is done , then it's possible that GMP may choose to have a set of incompatible functions which will be a headache for everyone. We have to remain compatible with GMP so the ui/si function must be long's , although larger type would work , C++ types would be different and so would C , function pointers, would DLL's be binary compatible? I think of mpz as a class that represents "the integers" , and so should be abstracted away from any thought of how it is represented in the computer. Good software design , especially for big systems is information hiding , it promotes parallelism in coding , when I use a compiler I should not need to know how it works , it's a black box that turns source code into executable's. How about a new class mpn_easy (I'm not serious about the name) which are just mpn's that have a sign and are memory managed.All the ease of use of mpz's , but efficient in the case when long!=limb Jason On Saturday 12 February 2011 13:35:11 Bill Hart wrote: > There's two other problems with what I suggest: > > 1) If someone builds MPIR in the default manner and an ui happens to > be 2 limbs, the code may run slower in MPIR than GMP. > > 2) flint2 has the convention that ui is an mp_limb_t and not a long. > So I'm not even consistent in my own code. > > Lots of other libraries have a different convention again, e.g. GSL and > MPFR. > > I will leave it up to you guys to decide what you want to do. I'm > merely giving my opinion based on what I've discovered from trying to > write interpreters, which may not be helpful. > > Bill. > > On 12 February 2011 13:19, Bill Hart <goodwillh...@googlemail.com> wrote: > > On 12 February 2011 13:11, Cactus <rieman...@gmail.com> wrote: > >> On Feb 12, 12:50 pm, Bill Hart <goodwillh...@googlemail.com> wrote: > >>> On 12 February 2011 10:07, Cactus <rieman...@gmail.com> wrote: > >>> > On Feb 9, 10:10 am, Cactus <rieman...@gmail.com> wrote: > >>> >> On Feb 8, 3:50 am, Case Vanhorsen <cas...@gmail.com> wrote: > >>> >> > On Mon, Feb 7, 2011 at 7:47 AM, Cactus <rieman...@gmail.com> wrote: > >>> >> > > On Feb 7, 3:09 pm, Case Vanhorsen <cas...@gmail.com> wrote: > >>> >> > >> On Mon, Feb 7, 2011 at 7:00 AM, Cactus <rieman...@gmail.com> wrote: > >>> >> > >> > This would also be a significant task but it would solve this > >>> >> > >> > problem once and for all. > >>> >> > >> > >>> >> > >> It does keep the API from growing. I can see it working with > >>> >> > >> statically linked applications (like gmpy) but wouldn't there > >>> >> > >> be DLL issues if two dynamically linked applications assumed > >>> >> > >> different interfaces? > >>> >> > > > >>> >> > > Only the application that made the wrong assumption :-) > >>> >> > > > >>> >> > > Brian > >>> >> > > > >>> >> > > -- > >>> >> > > You received this message because you are subscribed to the > >>> >> > > Google Groups "mpir-devel" group. To post to this group, send > >>> >> > > email to mpir-devel@googlegroups.com. To unsubscribe from this > >>> >> > > group, send email to mpir-devel+unsubscr...@googlegroups.com. > >>> >> > > For more options, visit this group > >>> >> > > athttp://groups.google.com/group/mpir-devel?hl=en. > >>> >> > > >>> >> > What about following the API in MPFR and adding mpz_set_sj where j > >>> >> > is defined to be intmax_t? IIUC, this should allow us to pass any > >>> >> > integer type. (And _uj for uintmax_t, etc.) > >>> >> > > >>> >> > This may be the most work, but it follows the precedent set in > >>> >> > MPFR. > >>> >> > > >>> >> > casevh > >>> >> > >>> >> Yes, that's a good solution. Its a lot of work but would be > >>> >> worthwhile in the long term. > >>> >> > >>> >> How many would volunteer some effort to do this though? I am not > >>> >> sure I would want to embark on this as the only contributor. > >>> >> > >>> >> On the plus side it should not be hard to draw up a small set of > >>> >> 'templates' for doing this, many of which already exist in the code. > >>> >> > >>> >> The get/set with limb and integer size relationships greater, equal > >>> >> and less would be fairly standard code. > >>> >> > >>> >> And others would involve faking up an appropriate GMP type from > >>> >> similar templates. > >>> >> > >>> >> Brian > >>> > > >>> > Case and I have been discussing how this issue should be approached > >>> > in an 'off list' email exchange so I want to expose a couple of > >>> > options here in case others have any views on the way ahead. > >>> > > >>> > One option is to duplicate (or even replace) all existing 'ui/si' > >>> > functions so that they all use either an mp_limb_t or an mp_slimb_t > >>> > (a new signed limb type) for their integer parameters. > >>> > >>> There is already a signed limb format. It is called mp_limb_signed_t > >>> > >>> > This would be manly a reuse of the existing source code but we would > >>> > need to check that the functions still work for all the limb/integer > >>> > size ratios that we might come across. > >>> > >>> An mp_limb_t can currently be a short int, long or long long depending > >>> on platform. As far as I know, an mp_limb_t is now always 32 or 64 > >>> bits. Odd sizes have all vanished since the big cleanup of old arches > >>> that Jason did. > >>> > >>> I think there are actually some old supported platforms on which long > >>> is *bigger* than the supported ABI, i.e. long is bigger than an > >>> mp_limb_t. Whether these machines are still supported and whether > >>> anyone but museums still owns such machines, I am unsure. But we must > >>> assume they still exist. > >>> > >>> The ui functions doubtlessly exist because most people write C code > >>> using either ints or longs or long longs. By having a set_ui function > >>> for example, one can pass either an int or a long or long long into an > >>> MPIR function without caring about what size a limb is. This is > >>> definitely how it should be. > >>> > >>> This highlights what should be the correct design principle, an ui > >>> should be larger than any type used commonly on that architecture. > >>> Then one can pass any size and automatic zero or sign extension will > >>> take care of everything for them. Thus on 64 bit Windows an ui should > >>> be a unsigned long long and an si should be a long long. > >>> > >>> Note a ui/si should *NOT* in general be the same thing as an mp_limb_t > >>> or mp_limb_signed_t. It might be that you have an ABI=32 bits machine > >>> on which an mp_limb_t is a long (because that is faster and has > >>> hardware support) but long long is 64 bits on that machine. The ui > >>> functions should still use long long and set two limbs. > >>> > >>> Now of course functions like mpn_addmul_1 would *NOT* use an ui/si. > >>> They would specifically use an mp_limb_t. This is for performance > >>> reasons. So in general mpz_set_ui would NOT do the same thing as > >>> mpn_set_ui. This is also how things should definitely be. > >>> > >>> The only problem with this approach is if someone wants a fast > >>> mpz_mul_ui and an ui is currently two limbs. In this case one might > >>> like to have an mpz_mul_1 function which multiplies by a limb instead > >>> of an ui. > >>> > >>> I definitely do not think it is a good idea to allow one to specify > >>> the size of an ui at compile time (of MPIR). > >>> > >>> As C is a compiled language, there is no chance to do this efficiently > >>> at run time. > >>> > >>> The only way to do it would be to allow it at compile time (of the > >>> application). > >>> > >>> In other words, one would have to do: > >>> > >>> #define MPIR_LIMB_UI > >>> #include "mpir.h" > >>> > >>> in the application being compiled against MPIR. This would set the > >>> size of an UI to the same size as a limb for efficiency. Thus when > >>> mpz_mul_ui is used, it would expect a limb sized ui instead of a long > >>> long or whatever the currently largest integer on that machine is. > >>> > >>> The reason I have an opinion on this issue is I've recently been > >>> fiddling a lot with compilers and interpreters, including coding some > >>> experimental ones, and the issue of different sized integers came up > >>> there. I finally had the revelation that if one supports the largest > >>> sized integer available, all the others are automatically supported > >>> (at the C level anyway) because of sign/zero extension, i.e. by C's > >>> automatic casting. > >>> > >>> > Another approach is to modify the existing 'ui/si' source code files > >>> > by using two defines: > >>> > > >>> > #define INT_VAR_TYPE > >>> > #define FN_SUFFIX > >>> > > >>> > internally for their integer types and their function suffixes and > >>> > then rename them to, say, function.inc. we can then use a source code > >>> > file function.c: > >>> > > >>> > #define INT_VAR_TYPE unsigned int > >>> > #define FN_SUFFIX ui > >>> > #include "function.inc' > >>> > #undef INT_VAR_TYPE > >>> > #undef FN_SUFFIX > >>> > > >>> > #define INT_VAR_TYPE unsigned long long > >>> > #define FN_SUFFIX ull > >>> > #include "function.inc' > >>> > #undef INT_VAR_TYPE > >>> > #undef FN_SUFFIX > >>> > > >>> > #define INT_VAR_TYPE uintmax_t > >>> > #define FN_SUFFIX uj > >>> > #include "function.inc' > >>> > #undef INT_VAR_TYPE > >>> > #undef FN_SUFFIX > >>> > > >>> > ....... > >>> > > >>> > for as many integer types as we want (we again need to check the > >>> > generic code will work for all anticipated limb/integer size > >>> > ratios). > >>> > > >>> > This is the 'C template' technique that the GNU Scientific Library > >>> > (GSL) uses to handle a similar issue. > >>> > > >>> > But I recall that such techniques can play havoc with the *nix build > >>> > system so it might be only be possible on a windows specific version > >>> > of MPIR, which would be a pity given our eventual desire to have a > >>> > unified build system for *nix and Windows. > >>> > > >>> > I would be interested in any views people might have on these issues > >>> > before we leap in and so any coding. > >>> > > >>> > Brian > >>> > > >>> > -- > >>> > You received this message because you are subscribed to the Google > >>> > Groups "mpir-devel" group. To post to this group, send email to > >>> > mpir-devel@googlegroups.com. To unsubscribe from this group, send > >>> > email to mpir-devel+unsubscr...@googlegroups.com. For more options, > >>> > visit this group athttp://groups.google.com/group/mpir-devel?hl=en. > >> > >> Can I hence assume that you favour redefining the _existing_ ui/si > >> functions to use intmax_t (signed) and uintmax_t (unsigned) for their > >> integer parameters? > > > > Not necessarily. I just think that it is the right way to fix this > > problem. I don't think it will affect many *nix platforms anyway, and > > I definitely think using unsigned long for ui functions is wrong. > > > > The difficulty with my proposal would be strict compatibility with > > GMP. I don't personally care about this because if we use the bigger > > integer for ui/si then correctly written code for GMP should still > > work with MPIR. > > > >> Case has suggested a parallel API for these operations (sj/uj), which > >> is a related but somewhat different approach. > >> > >> The 'C template' approach would allow us to do pretty well anything we > >> liked here. > >> > >> Brian > >> > >> -- > >> You received this message because you are subscribed to the Google > >> Groups "mpir-devel" group. To post to this group, send email to > >> mpir-devel@googlegroups.com. To unsubscribe from this group, send email > >> to mpir-devel+unsubscr...@googlegroups.com. For more options, visit > >> this group at http://groups.google.com/group/mpir-devel?hl=en. -- You received this message because you are subscribed to the Google Groups "mpir-devel" group. To post to this group, send email to mpir-devel@googlegroups.com. To unsubscribe from this group, send email to mpir-devel+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/mpir-devel?hl=en.