/* Copyright (C) 2016 Fredrik Johansson This file is part of FLINT. FLINT is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. See . */ #include #include #include "fmpz_poly.h" #include "profiler.h" int main(int argc, char * argv[]) { fmpz_poly_t f, g, h; fmpz_t c, d; slong bits, len, k, nthreads, minlen, maxlen, minbits, maxbits; double incbits, inclen; flint_rand_t state; flint_randinit(state); fmpz_poly_init(f); fmpz_poly_init(g); fmpz_poly_init(h); fmpz_init(c); fmpz_init(d); fmpz_one(d); nthreads = 1; minlen = 32; maxlen = 100000; inclen = 1.5; minbits = 32; maxbits = 400000; incbits = 2.0; for (k = 0; k < argc - 1; k++) { if (strcmp(argv[k], "-len") == 0) { minlen = maxlen = atoi(argv[k + 1]); if (k + 2 < argc && isdigit(argv[k + 2][0])) maxlen = atoi(argv[k + 2]); if (k + 3 < argc && isdigit(argv[k + 3][0])) inclen = atof(argv[k + 3]); } if (strcmp(argv[k], "-bits") == 0) { minbits = maxbits = atoi(argv[k + 1]); if (k + 2 < argc && isdigit(argv[k + 2][0])) maxbits = atoi(argv[k + 2]); if (k + 3 < argc && isdigit(argv[k + 3][0])) incbits = atof(argv[k + 3]); } if (strcmp(argv[k], "-threads") == 0) nthreads = atoi(argv[k + 1]); } flint_printf("len sizes: "); for (len = minlen; len <= maxlen; len = FLINT_MAX(len + 1, len * inclen)) flint_printf("%wd ", len); flint_printf("\nbit sizes: "); for (bits = minbits; bits <= maxbits; bits = FLINT_MAX(bits + 1, bits * incbits)) flint_printf("%wd ", bits); flint_printf("\nusing up to %wd threads\n\n", nthreads); for (len = minlen; len <= maxlen; len = FLINT_MAX(len + 1, len * inclen)) { for (bits = minbits; bits <= maxbits; bits = FLINT_MAX(bits + 1, bits * incbits)) { fmpz_poly_zero(f); for (k = 0; k < len; k++) { fmpz_randbits(c, state, bits); fmpz_poly_set_coeff_fmpz(f, k, c); } flint_printf("%wd %wd default ", len, bits); TIMEIT_START fmpz_poly_taylor_shift(g, f, d); TIMEIT_STOP /* flint_printf("%wd %wd compose ", len, bits); TIMEIT_START fmpz_poly_one(h); fmpz_poly_set_coeff_si(h, 1, 1); fmpz_poly_compose_divconquer(h, f, h); TIMEIT_STOP */ flint_printf("%wd %wd horner ", len, bits); TIMEIT_START fmpz_poly_taylor_shift_horner(g, f, d); TIMEIT_STOP for (k = 1; k <= nthreads; k *= 2) { flint_printf("%wd %wd dc%wd ", len, bits, k); flint_set_num_threads(k); TIMEIT_START fmpz_poly_taylor_shift_divconquer(g, f, d); TIMEIT_STOP flint_set_num_threads(1); } for (k = 1; k <= nthreads; k *= 2) { flint_printf("%wd %wd mm%wd ", len, bits, k); flint_set_num_threads(k); TIMEIT_START fmpz_poly_taylor_shift_multi_mod(g, f, d); TIMEIT_STOP flint_set_num_threads(1); } flint_printf("\n"); } } fmpz_poly_clear(f); fmpz_poly_clear(g); fmpz_poly_clear(h); fmpz_clear(c); fmpz_clear(d); flint_randclear(state); flint_cleanup(); return 0; }