From: Theodore P. <The...@so...> - 2007-08-22 16:05:32
|
Hi, These days I'm looking at adding some stuff to blitz::Array::iterator (see below). I was always quite puzzled by the operator++ implementation in blitz and never went into it in details, this was the occasion. It looks to me overly complicated (unless I missed something) so I wrote something I consider simpler. The attached sample code gives you the idea. As is, it passes all tests, examples and benchmarks as far as I can tell without regression (but iterator is of little use beside the iter.cpp in the testsuite). In a sample test, I quicly made (namely filling a 512x512X512 matrix 10 times, it is about 10% faster than the current code, even without the builtin_expect trick it's still faster though about less than 1%, so it seems at least on my computer with my compiler always a win. I guess postfix ++ is even faster as the iterator structure size is smaller with this patch. I did the buitin_expect trick 1) to learn how it works (and it might be useful in the original code and in other places), 2) to avoid to have to do loop peeling by hand as in the original code (need to check if this is really effective). It seems to be quite effective but do we want to add this complexity (I do not know if other compilers implement a similar stuff, I now VC++ has sothg of this kind). This is just a prototype to gather some feedback. If we follow the builtin_expect route some autoconf magic should be added (I can do the gcc part, other compilers would be more complicated to me except if there is already a proper autoconf macro). Also, the ConstPointerStack helper class is then used only once in fastiter.h (so maybe a removal is possible). My current goal is to add operator-- which I need for some project, which is quite simple with the proposed implementation except I need to change the end marker to point past the end of the data instead of pointing to 0. One other (longer term) goal would be to provide an iterator that only goes through the indices (basically drop the pointer processing to iterate over shapes (I'm not even sure that it wouldn't be faster to do so, to keep a reference to the array and use the standard indeing to acces the element, probably not but compiler do such amazing things these days...). Feedback and comments are also welcome on theses proposals... By the way, we need to change the maillist address in all blitz headers !!! Best regards, Theo. |