Bill Allombert on Sat, 17 Jun 2006 20:40:32 +0200

[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: PARI and POSIX threads

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;
  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
  // 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_join(th1,(void*)&F1);//Wait until they terminate and get
                               //theirs results
                                            //display the results.
  return 0;

If this program is called thread.c, you can compile it the following

cc thread.c -o thread.o -lpari -lpthread

(Add any -I/-L path as necessary).