[Nauty-list] Multithreading

Matthew Skala mskala at cs.umanitoba.ca
Fri Jan 13 00:23:45 EST 2012


[re-sending - I mistakenly sent the first copy from home address that
isn't subscribed]

On Thu, 12 Jan 2012, Susanne Niess wrote:
> As a comment mentioned that local functions have been made static, I suppose
> there is an alternative although I do not know how because I have never worked
> with local functions. Is there a nauty version that I can use with
> multithreading?

I don't think static functions are your problem, but static variables.
I've been able to use nauty in a multithreaded program by changing the
source code to add the "__thread" keyword to all static variables; this is
in gcc with pthreads, and I doubt that it's very portable.  I use the
attached Perl script, with a command line like this:

  ./mkts '__thread' nauty.c > tnauty.c

applied to each of nauty's .c and .h files, to create similarly-named
files prefixed with "t".  This is actually done automatically by my
project's Makefile in a fairly obvious way.  The exact details of the
include-modifying lines in the script might have to be changed if you're
including a different set of headers.

I don't know how useful that will be to anyone but myself - it is part of
a project that's still quite experimental and some distance away from the
project as a whole being ready to share - but the fundamental idea is
simple.  Any variables that are static in nauty become thread-local.  The
directive to do this might not be "__thread" if you're using something
other than gcc and Linux; that's why I made it a command-line argument to
the script, with eventual portability to other systems being a hope.

Although nauty's code does not technically become re-entrant with this
change (I couldn't invoke nauty again in the *same* thread during a nauty
call) it at least gives me the ability to invoke more than one copy of
nauty at the same time in *separate* threads, which is enough for my
purposes.

Making variables thread-local probably has some performance cost.  I
haven't tried to measure that, but it doesn't seem to have caused a
noticeable problem for me.

Static functions are a red herring; those are just the opposite of
"external" functions, and they don't inherently raise any multithreading
issues.
-- 
Matthew Skala
Postdoctoral Fellow, University of Manitoba
mskala at cs.umanitoba.ca

-------------- next part --------------
#!/usr/bin/perl

$tlkw=shift;

print "/* DO NOT EDIT THIS FILE - it is automatically generated. */\n";

while (<>) {
   s/(#include\s+)"nauty.h"/$1"tnauty.h"/g;
   s/(#include\s+)"nausparse.h"/$1"tnausparse.h"/g;
   
   s/(static\s+)
     (FILE|boolean|dispatchvec|graph|int|long|permutation|
        set|short|shortish|size_t|statsblk|tcnode|type|unsigned)
     (\s+[^(;,=]+[;,=])
    /$1$tlkw\ $2$3/gx;

   print;
}


More information about the Nauty mailing list