[GAP Forum] Multitasking with GAP

Christopher Jefferson caj21 at st-andrews.ac.uk
Tue May 18 09:01:30 BST 2021


Hi Alan,

You could look at "ParListByFork", from the IO package. This creates (using 'fork') some extra copies of GAP, and communicates with them via pipes.

There are some significant limitations of this function -- it requires the return values aren't too complicated (in practice, they must be accepted by the 'IO_Pickle' function).

Chris

-----Original Message-----
From: Alan Hylton <agh314 at lehigh.edu> 
Sent: Tuesday, May 18, 2021 6:35 AM
To: forum at gap-system.org
Subject: [GAP Forum] Multitasking with GAP

Howdy,

Suppose I have a list of lists, and I wish to run some time-consuming process on each of these sub-list (each sub-list is independent, so I am not worried about race conditions).

I think the easiest way to demonstrate my thought process is with code:

I have a list of lists and the number of cores I wish to use - master_list := [ [...], [...], ..., [...]]; n := Length(master_list); cores:=15;

I have a time consuming function whose arguments are ranges into master_list - time_consuming_func := function(start_index, stop_index) ...
end;

I portion out master_list, creating a list a tasks - task_list:=[]; start:=1; for i in [1..cores] do  flag:=0;  if i <= n mod cores then
  flag:=1;
 fi;
 if i > n then
  break;
 fi;
 len:=Int(n/cores)+flag;

 Add(task_list, RunTask( time_consuming_func , start, start+len-1));

 start:=start+len;
od;

I had several hopes:
1: I could get a list of tasks, and then use something like TaskFinished to see if each are done
2: Store the result of each time_consuming_func in the global master_list

But I ran into one problem: RunTask seems to be blocking. Instead of spawning a process and continuing with my loop, it waits until each task finishes. I considered DelayTask instead of RunTask so that I could just use WaitTask, but DelayTask does not seem to exist (similarly for asynchronous tasks). Is there an alternative? To follow the documentation, I'd like to avoid the lower-level CreateThread if I can.

Also, number 2 makes some assumptions on how memory works. Is it actually valid to have a thread working on element i of master_list modify the global master_list[i]?

I'd greatly appreciate any insight!

Thanks,
Alan
_______________________________________________
Forum mailing list
Forum at gap-system.org
https://mail.gap-system.org/mailman/listinfo/forum



More information about the Forum mailing list