Peter:

I am new to APL (~9 months). Most of my day-to-day work is sql/shell,
however I use APL for a couple things: 1.) as an ad-hoc calculator & 2.) a
symbolic notation that greatly simplifies complex mathematical calculations
in how I think about, remember, and approach them.

As for things I've built in APL, its been mostly toy projects. I built a
simple artificial neural net, however ran into difficulties when attempting
to generalize backpropagation
for arbitrary array sizes. I would like to complete this at some point.

Parallelizing APL was more of a curiosity, than an immediate need. I do not
plan to invest much energy into pursuing it at this time (especially in
light of Jürgen's explanation). To be honest I had watched a talk about cpu
caching in C++ and was interested in how that related to APL's handling of
arrays.

On Wed, Oct 16, 2019 at 9:53 PM Peter Teeson <peter.tee...@me.com> wrote:

> Hi Rowan:
>
> What classes of problems are you trying to solve that would benefit from
> parallel processing?
>
> Respect
>
> Peter Teeson
>
> On Oct 16, 2019, at 1:27 PM, Dr. Jürgen Sauermann <mail@xn--
> jrgen-sauermann-zvb.de> wrote:
>
> Hi Rowan,
>
> actually there is no syntax tree in GNU APL. The way in which APL binds
> names
> (*late and ambiguously)  makes it fairly useless to parse it beforehand.
> What happens
> in GNU APL is prefix matching at runtime. The prefix-table is in
> *src/Prefix.def* (an
> automatically generated hast table that does lookups essentially in time
> O(1) per prefix.)
>
> This lookup table replaces the AST that you would have in a compiled
> language,
>
> Best regards,
> Jürgen Sauermann
>
>
> On 10/16/19 6:55 PM, Rowan Cannaday wrote:
>
> Thanks again,
>
> AST = abstract syntax tree. The tree-like structure that is produced by
> the parser.
>
> Avoiding compilation is a reasonable restriction.
>
> Thanks for the context.
>
> - Rowan
>
> ```
> #gdb apl
> GNU gdb (Debian 8.3.1-1) 8.3.1
> Copyright (C) 2019 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later <
> http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.
> Type "show copying" and "show warranty" for details.
> This GDB was configured as "x86_64-linux-gnu".
> Type "show configuration" for configuration details.
> For bug reporting instructions, please see:
> <http://www.gnu.org/software/gdb/bugs/>.
> Find the GDB manual and other documentation resources online at:
>     <http://www.gnu.org/software/gdb/documentation/>.
>
> For help, type "help".
> Type "apropos word" to search for commands related to "word"...
> Reading symbols from apl...
> (gdb) run
> Starting program: /usr/local/bin/apl
> [Thread debugging using libthread_db enabled]
> Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
> [Detaching after vfork from child process 23377]
> [New Thread 0x7ffff68d7700 (LWP 23381)]
> [New Thread 0x7ffff60d6700 (LWP 23382)]
> [New Thread 0x7ffff58d5700 (LWP 23383)]
>
>                     ______ _   __ __  __    ___     ____   __
>                    / ____// | / // / / /   /   |   / __ \ / /
>                   / / __ /  |/ // / / /   / /| |  / /_/ // /
>                  / /_/ // /|  // /_/ /   / ___ | / ____// /___
>                  \____//_/ |_/ \____/   /_/  |_|/_/    /_____/
>
>                     Welcome to GNU APL version 1.8 / 1191M
>
>                 Copyright (C) 2008-2019  Dr. Jürgen Sauermann
>                        Banner by FIGlet: www.figlet.org
>
>                 This program comes with ABSOLUTELY NO WARRANTY;
>                   for details run: /usr/local/bin/apl --gpl.
>
>      This program is free software, and you are welcome to redistribute it
>          according to the GNU Public License (GPL) version 3 or later.
>
>       )OFF
>
> Goodbye.
> Session duration: 5.06809 seconds
> Couldn't read debug register: No such process.
> (gdb) Cannot find user-level thread for LWP 23382: generic error
> (gdb) [Thread 0x7ffff58d5700 (LWP 23383) exited]
> [Thread 0x7ffff60d6700 (LWP 23382) exited]
> [Thread 0x7ffff68d7700 (LWP 23381) exited]
> [Inferior 1 (process 23368) exited normally]
>
> (gdb) bt
> No stack.
>
> ```
>
> On Wed, Oct 16, 2019 at 4:18 PM Dr. Jürgen Sauermann <
> mail@jürgen-sauermann.de> wrote:
>
>> Hi Rowan,
>>
>> a stack-trace for the segfault would be good (command *gdb apl* then: '
>> *run*' and finally '*bt*' after
>> the segfault,
>>
>> No idea what AST is.
>> You could try TAB-expansion to get options in various situations and try
>> e.g.
>>
>>
>> *]help ⌹ *
>> to get help for APL primitives. Currently system functions and variables
>> are not in )help,
>> but I suppose extending file *src/Help.def* could easily add them.
>>
>>
>> Compiling APL is IMHO a wrong path. Too many problems, too little gain.
>>
>> Best Regards,
>> Jürgen Sauermann
>>
>>
>> On 10/16/19 5:01 PM, Rowan Cannaday wrote:
>>
>> Thank you for the explanation Jürgen.
>>
>> That makes intuitive sense. A shared-memory single threaded service is a
>> reasonable abstraction.
>>
>> Another approach, is to compile a subset of APL to an intermediate
>> representation.
>>
>> Is there a way to export the AST?
>> in addition - is there an in-repl method of viewing help and/or arguments
>> for system variables & functions?
>>
>> By the way, a minor regression: segfaulting, but only after exiting.
>> ```
>>       )OFF
>> ====================================================
>> SEGMENTATION FAULT
>> thread: 0x7f8747766700
>> thread_cSegmentation fault
>> ```
>>
>> Thanks again,
>> - Rowan
>>
>> On Wed, Oct 16, 2019 at 12:06 PM Dr. Jürgen Sauermann <
>> mail@jürgen-sauermann.de> wrote:
>>
>>> Hi Blake,
>>>
>>> it is sort of working, but I could well use some help in troubleshooting
>>> the remaining problems. I can help fixing them, but finding their root
>>> cause
>>> (and making them reproducible) is a different story.
>>>
>>> My current interpretation of various benchmarks that Elias Mårtenson and
>>> myself did some years ago is that the bandwidth of the memory interface
>>> between the CPUs (or cores) and the memory is the limiting factor, and no
>>> matter how efficient the APL interpreter is, this bottleneck will
>>> dictate the
>>> speedup that can be achieved.
>>>
>>> As an example, from 1985 to 1990, myself and 4 students had built a the
>>> hardware of a parallel APL machine with 32 CPUs and measured a speedup
>>> of close to 32 for sufficiently large vectors.
>>>
>>> In contrast, if I remember correctly, then  Elias achieved a speedup of
>>> 12 with
>>> 80 CPUs using the parallel feature of GNU APL. The only difference that
>>> I can see between our 1990 machine (called Datis-P-256 because the
>>> architecture
>>> could be scaled up to 256 processors) was the memory architecture:
>>>
>>> Datis-P had one separate memory for each CPU, while current multicore
>>> boxes share their memory module(s) among different cores. That simply
>>> boils down to the fact that the memory bandwidth of Datis-P scaled with
>>> the
>>> number of processors, while the number of cores on a typical multi-core
>>> box
>>> does not. As long as this is the case, parallel APL remains severely
>>> limited
>>> in terms of the speedup that can be achieved.
>>>
>>> Best Regards,
>>> Jürgen Sauermann
>>>
>>>
>>>
>>> On 10/16/19 12:58 PM, Blake McBride wrote:
>>>
>>> Greetings,
>>>
>>> I think getting the parallel processing working is important.  It may be
>>> that for various reasons the speedup in general cases is minimal and not
>>> worth the effort.  However, I'd imagine that there are particular use-cases
>>> utilizing large arrays where the speedup would be substantial.  That is
>>> when those types of enhancements would make APL a real benefit.
>>>
>>> Thanks.
>>>
>>> Blake
>>>
>>>
>>> On Wed, Oct 16, 2019 at 5:27 AM Dr. Jürgen Sauermann <
>>> mail@jürgen-sauermann.de> wrote:
>>>
>>>> Hi Rowan,
>>>>
>>>> fixed in *SVN 1191*.
>>>>
>>>> You should not be too enthusiastic, though, because the speed-ups that
>>>> can be achieved are somewhat disappointing. And due to that, I
>>>> haven't put too much effort into fixing faults (sometimes apl hangs
>>>> on a semaphore when parallel execution is enabled).
>>>>
>>>> Best Regards,
>>>> Jürgen Sauermann
>>>>
>>>>
>>>> On 10/16/19 5:15 AM, Rowan Cannaday wrote:
>>>>
>>>> Hello,
>>>>
>>>> intrigued by the ability to parallelize APL, thought I'd try to test it:
>>>>
>>>> `apl --cfg` followed by a line of '=' signs followed by `apl -q`:
>>>>
>>>>
>>>> configurable options:
>>>> ---------------------
>>>>     ASSERT_LEVEL_WANTED=2
>>>>     SECURITY_LEVEL_WANTED=0 (default)
>>>>     APSERVER_PATH=/tmp/GNU-APL/APserver (default)
>>>>     APSERVER_PORT=16366 (default)
>>>>     APSERVER_TRANSPORT=0 (default)
>>>>     CORE_COUNT_WANTED=2
>>>>     DYNAMIC_LOG_WANTED=yes
>>>>     MAX_RANK_WANTED=8 (default)
>>>>     RATIONAL_NUMBERS_WANTED=yes
>>>>     SHORT_VALUE_LENGTH_WANTED=12, therefore:
>>>>         sizeof(Value)       : 456 bytes
>>>>         sizeof(Cell)        :  24 bytes
>>>>         sizeof(Value header): 168 bytes
>>>>
>>>>     VALUE_CHECK_WANTED=yes
>>>>     VALUE_HISTORY_WANTED=yes
>>>>     VF_TRACING_WANTED=no (default)
>>>>     VISIBLE_MARKERS_WANTED=yes
>>>>
>>>> how ./configure was (probably) called:
>>>> --------------------------------------
>>>>     ./configure  'CORE_COUNT_WANTED=2' 'DEVELOP_WANTED=yes'
>>>> 'VALUE_HISTORY_WANTED=yes' 'VISIBLE_MARKERS_WANTED=yes'
>>>> '--enable-maintainer-mode'
>>>>
>>>> BUILDTAG:
>>>> ---------
>>>>     Project:        GNU APL
>>>>     Version / SVN:  1.8 / 1190M
>>>>     Build Date:     2019-10-16 02:45:24 UTC
>>>>     Build OS:       Linux 5.2.0-3-amd64 x86_64
>>>>     config.status:  'CORE_COUNT_WANTED=2' 'DEVELOP_WANTED=yes'
>>>> 'VALUE_HISTORY_WANTED=yes' 'VISIBLE_MARKERS_WANTED=yes'
>>>> '--enable-maintainer-mode'
>>>>     Archive SVN:    1161
>>>>
>>>>
>>>> ================================================================================
>>>>
>>>> $ apl -q
>>>>
>>>>
>>>> ====================================================
>>>> SEGMENTATION FAULT
>>>> thread: 0x7f6078042e00
>>>> thread_contexts_count: 2
>>>> busy_worker_count:     0
>>>> active_core_count:     1
>>>> thread # 0:               0 RUN  job:   0 no-name
>>>> thread #-1:               0 RUN  job:   0 no-name
>>>>
>>>>
>>>> ----------------------------------------
>>>> -- Stack trace at main.cc:88
>>>> ----------------------------------------
>>>> 0x7F6078FD1BBB __libc_start_main
>>>> 0x5631406C386D  main
>>>> 0x5631406CAD8D   init_apl(int, char const**)
>>>> 0x5631407E881B    Parallel::init(bool)
>>>> 0x563140832E2D     Thread_context::init_parallel(CoreCount, bool)
>>>> 0x7F60794E5B18      sem_init
>>>> 0x7F60794E8510
>>>> 0x5631406CA95A
>>>> ========================================
>>>> ====================================================
>>>>
>>>>
>>>>
>>>>
>>>
>>
>
>

Reply via email to