Bill Allombert on Thu, 22 Nov 2018 23:50:24 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
New parallel interface: export |
Dear PARI developers, We have made a new attempt to make writing parallel GP code easier. Currently global variables are not accessible in parallel code. In this new interface there is a dedicated namespace (the 'parallel world') that is used to assign values to global variables in parallel sections. This is done using the new export() command, which allow the main thread to set the values of global variables in the 'parallel world'. a silly example to see what it does: ? export(f=25); ? f %2 = f ? parsum(i=1,1,f) %3 = 25 So the global variable f in the main thread is not affected, while it takes the values 25 in the secondary threads. Without export GP would issue an error: ? f=25 %1 = 25 ? parsum(i=1,1,f) *** at top-level: parsum(i=1,1,f) *** ^--------------- *** parsum: mt: global variable not supported: f. A more natural example: ? f(x)=x^-2; ? export(f); /*implicitely: f=f */ ? parsum(i=1,10000,f(i),0.) %10 = 1.6448340718480597698060818333103109040 export() allows the function f to be usable in the threads. A more complex example ? \rmyscript ? exportall(); ? parfor(i=1,100,myfun(i)) exportall() is a variant of export() that export all current global variables with their current values. We also provide unexport/unexportall() to allow to remove a variable from the 'parallel world'. Variables in the 'parallel world' are read-only. Note that when using MPI, export()/exportall() actually require to send the values of the exported() variables through the networks to the other node and so can take a bit of time to complete if some variables are large. When using pthread, a single copy of the values of the exported() variables is shared across all threads. Cheers, Bill