Now it seems to run fine, under the same circumstances (on the SD card),
with the code unchanged.

On Tue, Aug 30, 2022 at 10:20 PM Devon McCormick <devon...@gmail.com> wrote:

> Unfortunately it looks like it was the same release when it worked as when
> it didn't:
> Engine: j904/j64avx2/windows
> Beta-e: commercial/2022-07-16T19:21:14
> Library: 9.04.03
> Platform: Win 64
>
> My problem may have to do with peculiarities of running on an SD card as
> though it were a regular hard-drive, so we can say this problem is not
> reproducible until I come up with a cleaner example or it goes away as
> mysteriously as it arrived.
>
> I have another multithreading project I will explore to see if the same
> problem occurs there.  If it does, it should be simple to reproduce.
>
> Until then, thanks for listening.
>
>
> On Sat, Aug 27, 2022 at 1:49 PM Henry Rich <henryhr...@gmail.com> wrote:
>
>> What release version did it work on?
>>
>> Henry Rich
>>
>> On 8/27/2022 1:46 PM, Devon McCormick wrote:
>> > My older, non-multithreaded, version works by dividing files into
>> batches
>> > in advance but this means that there may be a 10-20% difference in task
>> > times because we do not know in advance how long it takes to process
>> each
>> > file.  The advantage of the multithreaded version is that the variance
>> > between threads is minimal since all threads are pulling from the same
>> > stack.
>> > I should probably re-iterate that the code worked a few weeks ago and
>> has
>> > only started failing lately.
>> >
>> > On Sat, Aug 27, 2022 at 8:47 AM bill lam <bbill....@gmail.com> wrote:
>> >
>> >> I am not sure why you used mutex. If you collect all file names in a
>> >> subdirectory and divide it into 15 batches (apparently you want 15
>> tasks)
>> >> and feed each batch to a different tasks then there won't be any
>> >> collisions.
>> >>
>> >>
>> >> On Sat, 27 Aug 2022 at 11:50 AM Devon McCormick <devon...@gmail.com>
>> >> wrote:
>> >>
>> >>> Hi,
>> >>> So, here's some code I put together over the past few months to use
>> >>> multi-threading to parallelize a time-consuming process.
>> >>>
>> >>> We start with the top-level function:
>> >>>
>> >>> NB.* startFlipping: wrapper to set up for "flipN" by creating threads,
>> >>> setting up MUTEX,
>> >>> NB. moving to chip photo dir and flipping them on the chip.
>> >>> startFlipping=: 3 : 0
>> >>>     12 startFlipping y
>> >>> :
>> >>>     root=. y,':/DCIM/'         NB. y is drive letter of photo chip.
>> >>>     subds=. 0{"1 dir root,'*.'      NB. Process all subdirs' photos
>> >>>     svdir=. 1!:43'' [ createThreads 15 [ MUTEX=: 10 T. 0    NB. Fast
>> mutex
>> >>>     for_sd. subds do. sd=. ;sd      NB. Process each sub-dir
>> >>>         1!:44 ] root,sd
>> >>>         if. 0~:#FLS=: 0{"1 dir '*.jpg' do. tm=. 6!:1''
>> >>>             tms=. flipN x<.15       NB. Show time, run x threads, no
>> more
>> >>> than 15.
>> >>>             tm=. tm,~6!:1''
>> >>>          end.
>> >>>      end.
>> >>>      1!:44 svdir
>> >>>      tm;tms
>> >>> NB.EG tms=. 12 startFlipping 'F'  NB. Run 12 threads for all .JPGs
>> on F:
>> >>> )
>> >>>
>> >>> The thread-creation utility:
>> >>> createThreads=: 3 : '{{ 0 T. '''' }} ^:y]'''''
>> >>>
>> >>> Now we look at the cover for the core routine where we spin off the
>> >> threads
>> >>> in a for loop:
>> >>>
>> >>> flipN=: 3 : 0
>> >>>     tms=. i.0
>> >>>     while. y<#FLS do. pyx=. i.0
>> >>>         for_ix. i. y<.#FLS do. pyx=. pyx,flip1Photo t. '']ix end.
>> >>>         tms=. tms,-/&>_2{.&.>pyx
>> >>>     end.
>> >>> NB.EG tms=. flipN 10   NB. Run on 10 threads
>> >>> )
>> >>>
>> >>> This uses a "for" rather than "each" because, in testing, "for" seemed
>> >> less
>> >>> likely to crash.
>> >>>
>> >>> Finally, the deepest function that concerns multi-threaders:
>> >>>
>> >>> NB.* flip1Photo: flip a single photo.
>> >>> flip1Photo=: 3 : 0
>> >>>     assert. *./nameExists &> 'MUTEX';'FLS'    NB. Need these 2
>> globals:
>> >>> FLS=: 0{"1 dir '*.jpg' [ MUTEX=: 10 T. 0    NB. Fast mutex
>> >>>     tntxt=. ' '-.~":tn=. 3 T. '' [ tm=. 6!:1''      NB. Current thread
>> >>> number is "tn". "tm" is session start time.
>> >>>     if. 0<#FLS do.
>> >>>         myFl=. 'ThisFL',tntxt [ 11 T. MUTEX      NB. Lock mutex
>> >>>         (nms)=: split FLS [ nms=. myFl,' FLS'     NB. Take 1 filename
>> from
>> >>> list
>> >>>         13 T. MUTEX                           NB. Unlock mutex
>> >>>         if. 0~:#>".myFl do. *flipPhotoByOrientation* >".myFl end.
>> >>>     end.
>> >>>     tn,(6!:1''),tm   NB. Thread #, end, start session time.
>> >>> NB.EG flip1Photo t. '']0 [ flip1Photo t. '']1     NB. 2 threads
>> >>> )
>> >>>
>> >>> This concentrates all mutex-handling into one place and uses the
>> thread
>> >>> number to try to avoid collisions.  If you wanted to try the code
>> above,
>> >>> you could replace "flipPhotoByOrientation" with anything of your
>> choice.
>> >>>
>> >>> Anyway, about a week or so ago, this code seemed to (mostly) work but
>> >> now I
>> >>> get this with only a second or so delay:
>> >>>     6!:2 'tms=. 12 startFlipping ''F'''  NB. Run 12 threads for all
>> .JPGs
>> >> on
>> >>> F:
>> >>>
>> >>> Process shell<1> exited abnormally with code 5
>> >>>
>> >>> I'm afraid I may be on the bleeding edge here but does anyone have any
>> >>> ideas?  I've done a lot of testing and gotten a few things to work a
>> >> little
>> >>> but not for very long.  I used to be able to process hundreds of
>> photos
>> >>> with this code.
>> >>>
>> >>> Any help would be appreciated.  The above code should be enough to
>> >>> re-produce the issue once "flipPhotoByOrientation" has been replaced
>> by
>> >>> some target function, preferably one that takes a few seconds to run.
>> >>>
>> >>> Thanks,
>> >>>
>> >>> Devon
>> >>> --
>> >>>
>> >>> Devon McCormick, CFA
>> >>>
>> >>> Quantitative Consultant
>> >>> ----------------------------------------------------------------------
>> >>> For information about J forums see
>> http://www.jsoftware.com/forums.htm
>> >>>
>> >> ----------------------------------------------------------------------
>> >> For information about J forums see http://www.jsoftware.com/forums.htm
>> >>
>> >
>>
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
>>
>
>
> --
>
> Devon McCormick, CFA
>
> Quantitative Consultant
>
>

-- 

Devon McCormick, CFA

Quantitative Consultant
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to