示例#1
0
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;
}
示例#2
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;
}