On the subject of copying arrays, I was wondering, in GNU APL, where in code such as
A <- A,1 2 3 B <- A,4 5 6 A <- A,7 8 9 (in that order) A is copied. It has to be copied in the third line (unless some weird bookkeeping is done) as B referred to A's previous value, but can be modified in place in the first two lines. Also 1 2 3 + 3 4 5 where the result of + can overwrite one of its two arguments (the same goes for any scalar function). What is the in place situation of GNU APL? Thanks, Louis > On 4 Jul 2017, at 20:24, Juergen Sauermann <juergen.sauerm...@t-online.de> > wrote: > > Hi Blake, > > The state of GNU APL is, I believe, this: > > I am not aware of any unnecessary copying of arrays in GNU APL. There were > some suspicions > claimed earlier that some copying could be avoided. But it then turned out > that removing these > copies would corrupt other values under certain circumstances (because > different functions would > modify the same value). We therefore had to revert the "unnecessary copies" > to a state that seems > to be safe now. > > Regarding parallel processing, the situation seems to be so that a multi-core > CPU cannot be > significantly faster than a single-core CPU with the same memory > (-interface). A significant > speedup requires that the bandwidth between the cores and the memory grows > with the number > of cores. I had built a machine like that with some students back in 1990, > but the current PCs with > multi-core CPUs just do not provide that. > > If you make parallel1 and then run ScalarBenchmark.apl (which comes with GNU > APL) > then you get, for example: > > -------------- Mix_IRC + Mix1_IRC -------------- > average sequential startup cost: 530 cycles > average parallel startup cost: 1300 cycles > per item cost sequential: 122 cycles > per item cost parallel: 195 cycles > parallel break-even length: not reached > > This means that: > > the additional start-up cost for a parallel computation is 1300-530=770 > cycles or 240 nano-seconds > on a 3.2 GHz machine. This is actually a pretty good value. Before writing my > own core synchronization functions I used a standard paralle;ization library > that took aboutc 20,000 cycles. > I believe it was libmpi but that I was many years ago so I don't quite > remember. > > This startup cost also includes what Elias refers to as bookkeeping). > > What remains (and is the show-stopper) is the per item cost A single core > needs 122 cycles for > adding two numbers while 4 cores need 195 cycles per core = 780 cycles in > total. > The code in both cases is exactly the same. Putting it differenly, if I run > alone then some function > takes 122 cycles and when my collegues work in parallel on something that has > nothing > to do with my work then I need 780 cycles. > > Once the parallel startup has finished the cores work independently and > without any locks or > the like between them. This cannot be explained at software level but rather > suggests that > some common resource (memory ?!) is slowing each core down when some other > core(s) are > working at the same time. The 122 cycles (~40 ns) in the single core case is > roughly the time > for one DRAM access in page mode. In other words, the main memory bandwidth > (at least of > my machine) is just enough to feed one core, but far to low for 4 cores. > > GNU APL can do little to fix this bottleneck. I believe I have done > everything possible (although > new ideas are welcome) that can be done in software, but if we hit hardware > bottlenecks then > then thats it. I believe GNU APL would run perfectly on a 4-core CPU with a > 4-port main memory, > but that will probably remain a dream in my lifetime. > > Best Regards, > Jürgen Sauermann > > > >> On 07/04/2017 06:15 PM, Blake McBride wrote: >> Hi Ellas, >> >> I remember your earlier work and comments. In fact, that is the source of >> my knowledge of this. >> >> Putting more features on a base with known issues is problematic for the >> following reasons: >> >> 1. The time and effort it would take to secure the base is being spent >> elsewhere. >> >> 2. Adding new features is, in effect, ignoring the problem and moving on. >> >> 3. APL is good and useful as it is. If it's not being used as-is, then >> there is some other issue (like efficiency). I remember another post about >> unnecessary bloat because of the unnecessary copying. This was causing his >> machine to page unnecessarily. The unnecessary coping is major in terms of >> performance and memory efficiency. This is big. >> >> 4. APL was developed with the promise of parallel processing. This is >> something that wasn't practical back then, but is now. I am under the >> impression that this was one of the big reasons Juergen created GNU APL - to >> take advantage of parallel processing. >> >> Just one opinion. >> >> Blake >> >> >>> On Tue, Jul 4, 2017 at 11:01 AM, Elias Mårtenson <loke...@gmail.com> wrote: >>> Hello Blake, >>> >>> I agree those are important points too. Some time ago, I spent time trying >>> to improve those things. Unfortunately, my approach turned out to be a dead >>> end. I have some other ideas but those require a significantly different >>> underlying architecture. Essentially, it requires a garbage collector, >>> which changes things quite a bit. >>> >>> I'm sure Jürgen can go into more detail, but my impression is that avoiding >>> copying is much harder than it seems. >>> >>> Regards, >>> Elias >>> >>>> On 4 Jul 2017 22:57, "Blake McBride" <blake1...@gmail.com> wrote: >>>> My list would be different: >>>> >>>> 1. don't clone arrays unnecessarily >>>> >>>> 2. improve support for parallel processing >>>> >>>> With these, GNU APL would be much more efficient. I think moving the >>>> focus to CPU and memory efficiency is much more important than adding >>>> extensions of any sort. >>>> >>>> --blake >>>> >>>> >>>> On Tue, Jul 4, 2017 at 1:59 AM, Elias Mårtenson <loke...@gmail.com> wrote: >>>>> Thank you Jürgen, >>>>> >>>>> I think we understand each others positions, and agree that they are not >>>>> entirely the same. >>>>> >>>>> That said, your points are very well taken, and for the most part I >>>>> actually agree with you. >>>>> >>>>> I have a wishlist of features that I personally believe are important. >>>>> For the most part, these have been discussed previously but here they are >>>>> for completeness sake: >>>>> Bignums >>>>> Lexical binding. >>>>> First-class functions. >>>>> Rational numbers >>>>> Some kind of easy-to-use imperative structure (i.e. something better than >>>>> the horrific :If :Then :Else structure in Dyalog) >>>>> Some kind of complex datastructure (again, something better than the >>>>> Dyalog classes) >>>>> Note that out of these, the only feature that would change the semantics >>>>> compared to the ISO spec is the first, bignums. At least if it's >>>>> implemented in the "natural" way. >>>>> >>>>> I've considered working on some of these myself, but I have no intention >>>>> of doing so if you're against these >>>>> ideas in principle. I certainly have no desire to maintain my own version. >>>>> >>>>> Regards, >>>>> Elias >>>>> >>>>>> On 4 July 2017 at 03:21, Juergen Sauermann >>>>>> <juergen.sauerm...@t-online.de> wrote: >>>>>> Hi Elias, >>>>>> >>>>>> thanks for explaining your position. >>>>>> >>>>>> My concern about free software is not so much political but more >>>>>> practical. >>>>>> >>>>>> If I look at programming languages, then my impression is that those >>>>>> languages that make the >>>>>> exchange of software simple are more >>>>>> successful than those that do not. >>>>>> >>>>>> Historically it has always been possible to exchange APL software from >>>>>> one interpreter to another, >>>>>> but it was never easy. Most of the code can be exchanged via .ATF files, >>>>>> but the problems were >>>>>> often tiny incompatibilities. These incompatibilities are spread all >>>>>> over the code, so getting some >>>>>> APL workspace to work on a different machine is still an adventure. >>>>>> >>>>>> That is why I prefer to stick to the ISO standard, no matter how bad it >>>>>> is. As long as you use only >>>>>> standardised APL functions you have very few compatibility problems. >>>>>> There are some, but they >>>>>> are well known. But every new function that is not standardised moves >>>>>> you away from portability. >>>>>> If I object to implementing some new function than this is not for >>>>>> political reasons, but because I >>>>>> am afraid that the additional incompatibility makes the exchange of APL >>>>>> software more difficult. >>>>>> >>>>>> In some cases the function is so important that the incompatibility has >>>>>> to be accepted. Examples >>>>>> for that are certainly ⎕SQL, ⎕FIO, and maybe dyadic ⎕CR and ⎕DLX. These >>>>>> functions are almost >>>>>> impossible to implement efficiently by APL's own means. >>>>>> >>>>>> On the other end (from my point of view) we have things like the KEY >>>>>> function. I still believe that it >>>>>> rather fits into the FinAPL Idiom Library than into GNU APL. It is >>>>>> shorter than one APL line and if >>>>>> you make it an idiom then it remains portable between all APL >>>>>> interpreters while otherwise it is only >>>>>> portable between GNU APL and Dyalog APL. >>>>>> >>>>>> I am open to implementing a feature if it is really useful, but only >>>>>> then. Becoming a leader in >>>>>> implementing new feature is not one of my priorities. There are enough >>>>>> other APLs that are >>>>>> keen on that (e.g. Dyalog and NARS, see http://www.nars2000.org). The >>>>>> ambition of GNU APL >>>>>> has always been to become a stable standard interpreter some day. That >>>>>> is difficult enough, and >>>>>> we have learned from PL/I how too many features can kill a language. And >>>>>> I have seen too many >>>>>> software projects that failed due to being overly ambitious. I simply do >>>>>> not want to share their fate. >>>>>> >>>>>> Regarding emacs, I can't help to note that I am not using it, because it >>>>>> is, for my taste, too complex. >>>>>> I rather prefer something simpler like vi. Sometimes less is just more. >>>>>> >>>>>> Best Regards, >>>>>> /// Jürgen >>>>>> >>>>>> >>>>>>> On 07/03/2017 04:00 PM, Elias Mårtenson wrote: >>>>>>> Hello Jürgen, and thanks for your thorough reply. >>>>>>> >>>>>>> In terms of the usefulness of Key, I don't disagree with you. I'd >>>>>>> certainly like to see even more flexible solutions. >>>>>>> >>>>>>> Where we do disagree is what the goal of free software is. Arguably >>>>>>> there are probably as many goals as there are people. >>>>>>> >>>>>>> What follows below is an explanation as to why I disagree with your >>>>>>> assessment as to what is the best for >>>>>>> Free Software. Please don't take it as >>>>>>> personal criticism. You >>>>>>> know that I have the deepest respect for you as the maintainer and >>>>>>> author of GNU APL. >>>>>>> >>>>>>> After spending quite some time on the Emacs Development mailing list, I >>>>>>> have learned quite a bit about what the FSF's goals are with regards to >>>>>>> what they call "Free Software". Time and time again, RMS has stated >>>>>>> that the goal of GNU is to make people use commercial software less. In >>>>>>> order words, if a project can implement a feature that draws people >>>>>>> away from commercial software towards Free Software, then that is what >>>>>>> the project should do. >>>>>>> >>>>>>> At this point, I'd like to clarify that I am not completely in >>>>>>> agreement with >>>>>>> RMS on this. In the Emacs project, this position has prevented Emacs >>>>>>> from gaining certain important features, simply because they would have >>>>>>> made it easier to use "non-free" software together with Emacs. This is >>>>>>> a position I don't agree with. >>>>>>> >>>>>>> I'd really like to see GNU APL become a leader in implementing new >>>>>>> features. That way perhaps we get more people to switch. The point I'm >>>>>>> making here is that by implementing useful features that would make >>>>>>> people choose GNU APL before any alternative, then the project would >>>>>>> better serve the GNU goals. >>>>>>> >>>>>>> Regards, >>>>>>> Elias >>>>>>> >>>>>>>> On 3 July 2017 at 21:36, Juergen Sauermann >>>>>>>> <juergen.sauerm...@t-online.de> wrote: >>>>>>>> Hi Elias, >>>>>>>> >>>>>>>> thaks. The explanation is a bit clearer but the problems remain. >>>>>>>> >>>>>>>> Key is a non-standard APL function and we should be careful with the >>>>>>>> implementation >>>>>>>> of non-standard functions. >>>>>>>> >>>>>>>> Every function in GNU APL is an invitation to use it. If the function >>>>>>>> is obviously useful then it improves >>>>>>>> the language. If it merely solves a particular programming case, then >>>>>>>> it may >>>>>>>> improve GNU APL a little, >>>>>>>> but at the price of incompatibility. Programs using it become less >>>>>>>> portable and that undermines the >>>>>>>> goal of free software. >>>>>>>> >>>>>>>> So the question in such cases is how useful is a function and is that >>>>>>>> usefulness worth the incompatibility? >>>>>>>> >>>>>>>> In the case of the key function I would say no. >>>>>>>> >>>>>>>> First of all the key function can only be used if the data it operates >>>>>>>> on is organized in a specific way: that >>>>>>>> the first column is the key. That may >>>>>>>> be the case but the fact that this is needed >>>>>>>> is somewhat contrary to >>>>>>>> how other APL function work. You could also call that arbitrary. >>>>>>>> >>>>>>>> That goal can easily achieved by other means. If I have a single KEY >>>>>>>> then something along the lines of >>>>>>>> >>>>>>>> ((DATA[1;]≡KEY)⌿KEY)[1;] >>>>>>>> >>>>>>>> will give me the first row (or all rows if I remove the right [1;]) in >>>>>>>> an array that has that KEY. I suppose that is >>>>>>>> more or less what the key function does (plus applying some function >>>>>>>> on that expression). The expression is >>>>>>>> even superior to a function because it can be used at the left side of >>>>>>>> an assignment. >>>>>>>> >>>>>>>> If that is so then the key function is only one of several APL idioms >>>>>>>> (see http://aplwiki.com/FinnAplIdiomLibrary >>>>>>>> for a rather famous list of more than 700 such idioms). Each of the >>>>>>>> 700+ idioms is useful and would deserver >>>>>>>> its own symbol, but if we would do so (which is technically possible >>>>>>>> due to >>>>>>>> Unicode) then we would have turned >>>>>>>> GNU APL into an unreadable mess. >>>>>>>> >>>>>>>> Best Regards, >>>>>>>> Jürgen Sauermann >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>>> On 07/03/2017 05:50 AM, Elias Mårtenson wrote: >>>>>>>>> The key function is better described in the Dyalog reference manual, >>>>>>>>> on page 153 here: >>>>>>>>> http://docs.dyalog.com/16.0/Dyalog%20APL%20Language%20Reference%20Guide.pdf >>>>>>>>> >>>>>>>>> Essentially, it's a grouping function. It's used to create groups of >>>>>>>>> similar >>>>>>>>> things, and apply a function on the individual instances. The >>>>>>>>> examples in the section I referenced above should be pretty clear, I >>>>>>>>> think. >>>>>>>>> >>>>>>>>> Regards, >>>>>>>>> Elias >>>>>>>>> >>>>>>>>> On 3 July 2017 at 00:51, Juergen Sauermann >>>>>>>>> <juergen.sauerm...@t-online.de> wrote: >>>>>>>>>> Hi Elias, >>>>>>>>>> >>>>>>>>>> I am not quite in favour of it and it has problems. >>>>>>>>>> >>>>>>>>>> It is not on my keyboard (even though I am using a Dyalog keyboard). >>>>>>>>>> Not to talk about other keyboards. >>>>>>>>>> >>>>>>>>>> It does not really look like need-to-have function and I suppose it >>>>>>>>>> can be >>>>>>>>>> efficiently performed by a short combination of other APL primitives. >>>>>>>>>> >>>>>>>>>> In my opinion adding primitives for every imaginable use case (and >>>>>>>>>> there are certainly use cases for the key function) leads to an >>>>>>>>>> overloading >>>>>>>>>> of the APL language in the long run and does not improve the >>>>>>>>>> language. >>>>>>>>>> >>>>>>>>>> Another problem is that after reading the description several times, >>>>>>>>>> I still >>>>>>>>>> can't explain in simple terms what the function is actually doing. >>>>>>>>>> That makes >>>>>>>>>> it >>>>>>>>>> a good candidate for a never used function if it should ever be >>>>>>>>>> implemented. >>>>>>>>>> >>>>>>>>>> Best Regards, >>>>>>>>>> Jürgen Sauermann >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>> On 07/02/2017 06:24 PM, Elias Mårtenson wrote: >>>>>>>>>>> How about implementing the key function, ⌸? >>>>>>>>>>> >>>>>>>>>>> It's described in this article on the Dyalog site: >>>>>>>>>>> https://www.dyalog.com/blog/2015/04/exploring-key/ >>>>>>>>>>> >>>>>>>>>>> Jürgen, are you in favour of this function? >>>>>>>>>>> >>>>>>>>>>> Regards, >>>>>>>>>>> Elias >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >> >