From: Ian Jackson Date: Tue, 7 Oct 2008 20:53:25 +0000 (+0100) Subject: machinery for checking that our OUTER parallel iteration works - before we delete it X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=moebius2.git;a=commitdiff_plain;h=cd84cbc4ca24530cfd110b53019706babc3986a5 machinery for checking that our OUTER parallel iteration works - before we delete it --- diff --git a/energy.c b/energy.c index c009067..a4cfbb1 100644 --- a/energy.c +++ b/energy.c @@ -174,6 +174,8 @@ void compute_edge_lengths(const Vertices vertices, int section) { edge_lengths[v1][e]= hypotD(vertices[v1],vertices[v2]); } +#include + void compute_vertex_areas(const Vertices vertices, int section) { int v0,v1,v2, e1,e2; // int k; @@ -248,7 +250,24 @@ double line_bending_cost(const Vertices vertices, int section) { double a[D3], b[D3], axb[D3]; double total_cost= 0; + if (quitting_last_iteration) { + char buf[100]; + int n= sprintf(buf, + "section=%d thr=%#08lx qi=0x%03x START\n", + section,(unsigned long)pthread_self(), N); + write(2,buf,n); + quitting_reported_threads= 1; + } + FOR_EDGE(qi,e,ri, OUTER) { + if (quitting_last_iteration) { + char buf[100]; + int n= sprintf(buf, + "section=%d thr=%#08lx qi=0x%03x,e=%d,ri=0x%03x\n", + section,(unsigned long)pthread_self(),qi,e,ri); + write(2,buf,n); + } + pi= EDGE_END2(qi,(e+3)%V6); if (pi<0) continue; //if (!(qi&XMASK)) fprintf(stderr,"%02x-%02x-%02x (%d)\n",pi,qi,ri,e); diff --git a/minimise.c b/minimise.c index bf5b096..d52a685 100644 --- a/minimise.c +++ b/minimise.c @@ -62,6 +62,14 @@ static void badusage(void) { exit(8); } +static sig_atomic_t quit_requested; +sig_atomic_t quitting_reported_threads; +int quitting_last_iteration; + +static void sigint_handler(int ignored) { + quit_requested= 1; +} + int main(int argc, const char *const *argv) { gsl_multimin_function multimin_function; double size; @@ -70,6 +78,7 @@ int main(int argc, const char *const *argv) { FILE *initial_f; gsl_vector initial_gsl, step_size_gsl; int r, i, size_check_counter= 0; + struct sigaction sa; if (argc==3) { input_file= argv[1]; @@ -88,6 +97,12 @@ int main(int argc, const char *const *argv) { if (final_file) if (asprintf(&final_file_tmp,"%s.new",final_file) <= 0) diee("asprintf"); + memset(&sa,0,sizeof(sa)); + sa.sa_handler= sigint_handler; + sa.sa_flags= SA_RESETHAND; + r= sigaction(SIGINT,&sa,0); + if (r) diee("sigaction SIGINT"); + graph_layout_prepare(); printing_init(); energy_init(); @@ -124,6 +139,11 @@ int main(int argc, const char *const *argv) { &initial_gsl, &step_size_gsl) ); for (;;) { + if (quit_requested) { + fprintf(stderr,"SIGINT caught, quitting soon.\n"); + quitting_last_iteration= 1; + } + GA( gsl_multimin_fminimizer_iterate(minimiser) ); if (!(size_check_counter++ % DIM)) { @@ -137,6 +157,9 @@ int main(int argc, const char *const *argv) { if (r==GSL_SUCCESS) break; assert(r==GSL_CONTINUE); } + + if (quitting_reported_threads) + exit(1); } if (final_file) { diff --git a/minimise.h b/minimise.h index c2e13e7..cf450c2 100644 --- a/minimise.h +++ b/minimise.h @@ -31,6 +31,10 @@ extern const char *input_file, *best_file; extern char *best_file_tmp; extern long long evaluations; extern double stop_epsilon; +extern int quitting_last_iteration; + +#include +extern sig_atomic_t quitting_reported_threads; enum printing_instance { pr_cost, pr_size, pr__max }; int printing_check(enum printing_instance, int indent); diff --git a/parallel.h b/parallel.h index a8a748f..77025e5 100644 --- a/parallel.h +++ b/parallel.h @@ -14,11 +14,11 @@ /* used anamorphically: section, nsections */ #define OUTER_PERSECTION_BASE(zero,n, sect) \ - ((zero) + sect * (((n)-(zero) + NSECTIONS-1) / NSECTIONS)) -#define OUTER(v,zero,n, precomp) \ - for ((v)= OUTER_PERSECTION_BASE((zero),(n), section); \ - precomp, \ - (v) < OUTER_PERSECTION_BASE((zero),(n), section + 1) && (v) < (n); \ + ((zero) + (sect) * (((n)-(zero) + NSECTIONS-1) / NSECTIONS)) +#define OUTER(v,zero,n, precomp) \ + for ((v)= OUTER_PERSECTION_BASE((zero),(n), (section)); \ + precomp, \ + (v) < OUTER_PERSECTION_BASE((zero),(n), (section) + 1) && (v) < (n); \ (v)++) /*