Hello PARI-dev,
I have commited a patch that add a new _experimental_ Configure option
--enable-tls that implement thread-local PARI stack.
This option:
1) Break the libpari ABI (the resulting library will not be compatible
with the old one.
2) Only work on system that implement the __thread storage class
3) add 2 public functions pari_thread_init() and pari_thread_close()
that should be called when starting (resp. closing) a thread
and allocate/deallocate the local stack and local cached universal
constants. The functions are provided even if --enable-tls is not set
but do not do anyting interesting.
Here an commented example of multi-threaded PARI program:
#include <pari/pari.h> // Include PARI headers
#include <pthread.h> // Include POSIX threads headers
void * mydet(void * arg)
{
GEN M=(GEN)arg;
GEN F;
pari_thread_init(8000000); // Initialize a local PARI stack for this
// thread of 8000000 bytes.
F=gclone(det(M)); // compute the determinant using the local
// stack
// clone the result so we can free the
// stack
pari_thread_close(); // Free the PARI stack
pthread_exit((void *)F); // End the thread and return F.
return F; // spurious
}
void * myfactor(void * arg) //exactly the same as above.
{
GEN N=(GEN)arg;
GEN F;
pari_thread_init(4000000);
F=gclone(factor(N));
pari_thread_close();
pthread_exit((void *)F);
return F;
}
int main(void)
{
GEN M,N1,N2, F1,F2,D;
pthread_t th1, th2, th3; // Allocate POSIX-thread variables.
pari_init(4000000,500000); //Initialise the main PARI stack
//and global objects (gen_0, etc.)
N1=addis(gpowgs(gen_2,256),1); //do computation in the main PARI
//stack
N2=subis(gpowgs(gen_2,193),1);
M=mathilbert(80);
// The functions pthread_create and pthread_create are standard
// POSIX-thread functions to start and get the result of threads.
pthread_create(&th1,NULL,&myfactor,(void*)N1);//Start threads
pthread_create(&th2,NULL,&myfactor,(void*)N2);
pthread_create(&th3,NULL,&mydet,(void*)M);
pthread_join(th1,(void*)&F1);//Wait until they terminate and get
//theirs results
pthread_join(th2,(void*)&F2);
pthread_join(th3,(void*)&D);
pariputsf("F1=%Z\nF2=%Z\nlog(D)=%Z\n",F1,F2,glog(D,3));
//display the results.
return 0;
}
If this program is called thread.c, you can compile it the following
way:
cc thread.c -o thread.o -lpari -lpthread
(Add any -I/-L path as necessary).
Cheers,
Bill