diff --git a/timing/timing.c b/timing/timing.c index ce237a2d69eec4edc80b68beb74e5aeb6b7a7c38..c3ab9f9a18c2c964d1b1b2da5342af6d44510546 100644 --- a/timing/timing.c +++ b/timing/timing.c @@ -375,8 +375,8 @@ show_help(char *prog_name) { " -k, --k, --K, --nrhs=x Dimension (K) of the matrices or number of right-hand size (default: 1)\n" " -b, --nb=x Nb size. (default: 320)\n" " -i, --ib=x IB size. (default: 32)\n" - " -x, --mx=x ?\n" //todo - " -X, --nx=x ?\n" //todo + //" -x, --mx=x ?\n" todo + //" -X, --nx=x ?\n" todo "\n" " Check/prints:\n" " --niter=x Number of iterations performed for each test (default: 1)\n" @@ -407,10 +407,10 @@ show_help(char *prog_name) { " -s, --sync Enable synchronous calls in wrapper function such as POTRI\n" " -o, --ooc Enable out-of-core (available only with StarPU)\n" " -G, --gemm3m Use gemm3m complex method\n" - " --peak ?\n"//todo - " --bound ?\n"//todo - " --bounddeps ?\n"//todo - " --bounddepsprio ?\n"//todo + //" --peak ?\n"todo + //" --bound ?\n"todo + //" --bounddeps ?\n"todo + //" --bounddepsprio ?\n"todo "\n"); } @@ -548,6 +548,33 @@ set_iparam_default(int *iparam){ iparam[IPARAM_QR_DOMINO ] = -1; } +static inline int +read_integer_from_options(int long_index) +{ + char *endptr; + long int value; + (void) long_index; + + value = strtol(optarg, &endptr, 10); + if ( *optarg == '\0' || *endptr != '\0' ) { +#ifdef CHAMELEON_HAVE_GETOPT_LONG + if ( long_index < 0 ) { +#endif + fprintf(stderr, "Invalid numeric value for '-%c' parameter\n", optopt); +#ifdef CHAMELEON_HAVE_GETOPT_LONG + } else { + fprintf(stderr, "Invalid numeric value for '--%s' parameter\n", long_options[long_index].name); + } +#endif + exit(EXIT_FAILURE); + } + if ( value > INT_MAX || value < INT_MIN ) { + fprintf(stderr, "Out of range integer '%ld'\n", value); + exit(EXIT_FAILURE); + } + return (int)value; +} + void parse_arguments(int *_argc, char ***_argv, int *iparam, int *start, int *stop, int*step) { @@ -569,24 +596,24 @@ parse_arguments(int *_argc, char ***_argv, int *iparam, int *start, int *stop, i switch(c) { // Configuration - case 't' : iparam[IPARAM_THRDNBR ] = atoi(optarg); break; - case 'g' : iparam[IPARAM_NCUDAS ] = atoi(optarg); break; - case 'P' : iparam[IPARAM_P ] = atoi(optarg); break; + case 't' : iparam[IPARAM_THRDNBR ] = read_integer_from_options(atoi(optarg)); break; + case 'g' : iparam[IPARAM_NCUDAS ] = read_integer_from_options(atoi(optarg)); break; + case 'P' : iparam[IPARAM_P ] = read_integer_from_options(atoi(optarg)); break; case '8' : iparam[IPARAM_NO_CPU ] = 1; break; // Matrix parameters case 'M' : - case 'm' : iparam[IPARAM_M ] = atoi(optarg); break; - case 'n' : iparam[IPARAM_N ] = atoi(optarg); break; + case 'm' : iparam[IPARAM_M ] = read_integer_from_options(atoi(optarg)); break; + case 'n' : iparam[IPARAM_N ] = read_integer_from_options(atoi(optarg)); break; case 'N' : get_range(optarg, start, stop, step); break; case 'K' : - case 'k' : iparam[IPARAM_K ] = atoi(optarg); break; - case 'b' : iparam[IPARAM_NB ] = atoi(optarg); - iparam[IPARAM_MB ] = atoi(optarg); break; - case 'i' : iparam[IPARAM_IB ] = atoi(optarg); break; - case 'x' : iparam[IPARAM_MX ] = atoi(optarg); break; - case 'X' : iparam[IPARAM_NX ] = atoi(optarg); break; + case 'k' : iparam[IPARAM_K ] = read_integer_from_options(atoi(optarg)); break; + case 'b' : iparam[IPARAM_NB ] = read_integer_from_options(atoi(optarg)); + iparam[IPARAM_MB ] = read_integer_from_options(atoi(optarg)); break; + case 'i' : iparam[IPARAM_IB ] = read_integer_from_options(atoi(optarg)); break; + case 'x' : iparam[IPARAM_MX ] = read_integer_from_options(atoi(optarg)); break; + case 'X' : iparam[IPARAM_NX ] = read_integer_from_options(atoi(optarg)); break; // Check/prints - case '1' : iparam[IPARAM_NITER ] = atoi(optarg); break; + case '1' : iparam[IPARAM_NITER ] = read_integer_from_options(atoi(optarg)); break; case 'W' : iparam[IPARAM_PRINT_WARNINGS] = 0; break; case 'w' : iparam[IPARAM_WARMUP ] = 0; break; case 'c' : iparam[IPARAM_CHECK ] = 1; break; @@ -597,12 +624,12 @@ parse_arguments(int *_argc, char ***_argv, int *iparam, int *start, int *stop, i case 'd' : iparam[IPARAM_DAG ] = 1; break; case 'p' : iparam[IPARAM_PROFILE ] = 1; break; // HQR options - case 'a' : iparam[IPARAM_RHBLK ] = atoi(optarg); break; - case 'l' : iparam[IPARAM_LOWLVL_TREE ] = atoi(optarg); break; - case 'L' : iparam[IPARAM_HIGHLVL_TREE ] = atoi(optarg); break; + case 'a' : iparam[IPARAM_RHBLK ] = read_integer_from_options(atoi(optarg)); break; + case 'l' : iparam[IPARAM_LOWLVL_TREE ] = read_integer_from_options(atoi(optarg)); break; + case 'L' : iparam[IPARAM_HIGHLVL_TREE ] = read_integer_from_options(atoi(optarg)); break; case 'D' : iparam[IPARAM_QR_DOMINO ] = 1; break; //Other - case '9' : iparam[IPARAM_MODE ] = atoi(optarg); break; + case '9' : iparam[IPARAM_MODE ] = read_integer_from_options(atoi(optarg)); break; case '3' : iparam[IPARAM_BIGMAT ] = 0; break; case 's' : iparam[IPARAM_ASYNC ] = 0; break; case 'o' : iparam[IPARAM_OOC ] = 1; break;