int main(int argc, char* argv[]) { unsigned int operation = atoi(argv[1]); size_t n = atoi(argv[2]); clock_t begin, end; double time_spent[SAMPLE_SIZE]; double min, max; double (*compute_pi)(size_t); char method_name[32]; char time_filename[32]; char error_filename[32]; switch(operation) { case 0: compute_pi = &compute_pi_baseline; strcpy(method_name, "compute_pi_baseline"); strcpy(time_filename, "time_baseline.txt"); strcpy(error_filename, "error_baseline.txt"); break; case 1: compute_pi = &compute_pi_avx; strcpy(method_name, "compute_pi_avx"); strcpy(time_filename, "time_avx.txt"); strcpy(error_filename, "error_avx.txt"); break; case 2: compute_pi = &compute_pi_leibniz; strcpy(method_name, "compute_pi_leibniz"); strcpy(time_filename, "time_leibniz.txt"); strcpy(error_filename, "error_leibniz.txt"); break; case 3: compute_pi = &compute_pi_leibniz_avx; strcpy(method_name, "compute_pi_leibniz_avx"); strcpy(time_filename, "time_leibniz_avx.txt"); strcpy(error_filename, "error_leibniz_avx.txt"); break; case 4: compute_pi = &compute_pi_euler; strcpy(method_name, "compute_pi_euler"); strcpy(time_filename, "time_euler.txt"); strcpy(error_filename, "error_euler.txt"); break; case 5: compute_pi = &compute_pi_euler_avx; strcpy(method_name, "compute_pi_euler_avx"); strcpy(time_filename, "time_euler_avx.txt"); strcpy(error_filename, "error_euler_avx.txt"); break; case 6: compute_pi = &compute_pi_euler2; strcpy(method_name, "compute_pi_euler2_avx"); strcpy(time_filename, "time_euler2.txt"); strcpy(error_filename, "error_euler2.txt"); break; default: break; } for (int i = 0; i < SAMPLE_SIZE; i++) { begin = clock(); compute_pi(n * 1000000); end = clock(); time_spent[i] = (double)(end - begin) / CLOCKS_PER_SEC; } double mean_time = compute_ci(&min, &max, time_spent); double pi = compute_pi(n * 1000000); double diff = pi - M_PI > 0 ? pi - M_PI : M_PI - pi; double error = diff / M_PI; printf("%s(%zuM) needs time in 95%% confidence interval[%lf, %lf]\n", method_name, n, min, max); printf("error rate = %.15lf\n", error); FILE *fw = fopen(time_filename, "a"); fprintf(fw, "%zu %lf\n", n, mean_time); fclose(fw); fw = fopen(error_filename, "a"); fprintf(fw, "%zu %.15lf\n", n, error); fclose(fw); return 0; }
int main(int argc, char* argv[]) { char operation[32]; size_t n = atoi(argv[2]); strncpy(operation, argv[1], 32); clock_t begin, end; double time_spent[SAMPLE_SIZE]; double min, max; double (*compute_pi)(size_t); char method_name[64]; char time_filename[64]; char error_filename[64]; if (!strcmp(operation, "baseline")) { compute_pi = &compute_pi_baseline; strcpy(method_name, "compute_pi_baseline"); strcpy(time_filename, "time_baseline.txt"); strcpy(error_filename, "error_baseline.txt"); } else if (!strcmp(operation, "baseline_avx")) { compute_pi = &compute_pi_baseline_avx; strcpy(method_name, "compute_pi_baseline_avx"); strcpy(time_filename, "time_baseline_avx.txt"); strcpy(error_filename, "error_baseline_avx.txt"); } else if (!strcmp(operation, "leibniz")) { compute_pi = &compute_pi_leibniz; strcpy(method_name, "compute_pi_leibniz"); strcpy(time_filename, "time_leibniz.txt"); strcpy(error_filename, "error_leibniz.txt"); } else if (!strcmp(operation, "leibniz_avx")) { compute_pi = &compute_pi_leibniz_avx; strcpy(method_name, "compute_pi_leibniz_avx"); strcpy(time_filename, "time_leibniz_avx.txt"); strcpy(error_filename, "error_leibniz_avx.txt"); } else if (!strcmp(operation, "leibniz_avx_opt")) { compute_pi = &compute_pi_leibniz_avx_opt; strcpy(method_name, "compute_pi_leibniz_avx_opt"); strcpy(time_filename, "time_leibniz_avx_opt.txt"); strcpy(error_filename, "error_leibniz_avx_opt.txt"); } else if (!strcmp(operation, "leibniz_avx_opt_single")) { compute_pi = &compute_pi_leibniz_avx_opt_single; strcpy(method_name, "compute_pi_leibniz_avx_opt_single"); strcpy(time_filename, "time_leibniz_avx_opt_single.txt"); strcpy(error_filename, "error_leibniz_avx_opt_single.txt"); } else if (!strcmp(operation, "leibniz_fma")) { compute_pi = &compute_pi_leibniz_fma; strcpy(method_name, "compute_pi_leibniz_fma"); strcpy(time_filename, "time_leibniz_fma.txt"); strcpy(error_filename, "error_leibniz_fma.txt"); } else if (!strcmp(operation, "recursion")) { compute_pi = &compute_pi_recursion; strcpy(method_name, "compute_pi_recursion"); strcpy(time_filename, "time_recursion.txt"); strcpy(error_filename, "error_recursion.txt"); } else if (!strcmp(operation, "leibniz_JM")) { compute_pi = &compute_pi_leibniz_JM; strcpy(method_name, "compute_pi_leibniz_JM"); strcpy(time_filename, "time_leibniz_JM.txt"); strcpy(error_filename, "error_leibniz_JM.txt"); } for (int i = 0; i < SAMPLE_SIZE; i++) { begin = clock(); compute_pi(n * 1024*1024); end = clock(); time_spent[i] = (double)(end - begin) / CLOCKS_PER_SEC; } double mean_time = compute_ci(&min, &max, time_spent); double pi = 0.0; pi = compute_pi(n * 1024*1024); double diff = pi - M_PI > 0 ? pi - M_PI : M_PI - pi; double error = diff / M_PI; printf("%s(%zuM) needs time in 95%% confidence interval[%lf, %lf]\n", method_name, n, min, max); printf("error rate = %.15lf\n", error); FILE *fw = fopen(time_filename, "a"); fprintf(fw, "%zu %lf\n", n, mean_time); fclose(fw); fw = fopen(error_filename, "a"); fprintf(fw, "%zu %.15lf\n", n, error); fclose(fw); return 0; }