diff --git a/ecmfactor.c b/ecmfactor.c index 4b87a84fea5a4436fe8c780f25b4476f52fe1f99..3e4979733d240e6c87dabf8395d1a03a6d6bc05b 100644 --- a/ecmfactor.c +++ b/ecmfactor.c @@ -49,22 +49,38 @@ main (int argc, char *argv[]) { mpz_t n; double B1; - unsigned long nthreads = 1, i; + unsigned long nthreads = 1, ncurves = 1, i; tab_t *T; pthread_t *tid; - if (argc >= 3 && strcmp (argv[1], "-t") == 0) + while (argc > 1 && argv[1][0] == '-') + { + if (argc >= 3 && strcmp (argv[1], "-t") == 0) { nthreads = strtoul (argv[2], NULL, 10); argc -= 2; argv += 2; } - - if (argc < 3) + else if (argc >= 3 && strcmp (argv[1], "-c") == 0) + { + ncurves = strtoul (argv[2], NULL, 10); + argc -= 2; + argv += 2; + } + else { - fprintf (stderr, "Usage: ecmfactor [-t nnn] <number> <B1>\n"); + fprintf (stderr, "Unknown option: %s\n", argv[1]); exit (1); } + } + + if (argc < 3) + { + fprintf (stderr, "Usage: ecmfactor [-t nnn] [-c nnn] <number> <B1>\n"); + fprintf (stderr, " -t nnn - use nnn threads\n"); + fprintf (stderr, " -c nnn - perform nnn curves\n"); + exit (1); + } /* initialize tab_t for threads */ T = malloc (nthreads * sizeof (tab_t)); @@ -81,7 +97,12 @@ main (int argc, char *argv[]) B1 = atof (argv[2]); - for (i = 0; i < nthreads ; i++) + while (ncurves > 0) + { + if (ncurves < nthreads) + nthreads = ncurves; + + for (i = 0; i < nthreads ; i++) { mpz_init_set (T[i]->n, n); T[i]->B1 = B1; @@ -89,13 +110,13 @@ main (int argc, char *argv[]) ecm_init (T[i]->q); } - printf ("Performing %lu curve(s) with B1=%1.0f\n", nthreads, B1); - for (i = 0; i < nthreads; i++) - pthread_create (&tid[i], NULL, one_thread, (void *) (T+i)); - for (i = 0; i < nthreads; i++) - pthread_join (tid[i], NULL); + printf ("Performing %lu curve(s) with B1=%1.0f\n", nthreads, B1); + for (i = 0; i < nthreads; i++) + pthread_create (&tid[i], NULL, one_thread, (void *) (T+i)); + for (i = 0; i < nthreads; i++) + pthread_join (tid[i], NULL); - for (i = 0; i < nthreads; i++) + for (i = 0; i < nthreads; i++) { gmp_printf ("thread %lu with sigma %d:%Zd ", i, T[i]->q->param, T[i]->q->sigma); @@ -110,6 +131,9 @@ main (int argc, char *argv[]) ecm_clear (T[i]->q); } + ncurves -= nthreads; + } + mpz_clear (n); free (T);