/* Запустить таймер */
void timer_start (void)
{
  TimerStarted = 1;
  StartTime = PrevTime = get_time ();
#ifdef MEASURE_FULL_TIME
  StartFullTime = PrevFullTime = get_full_time ();
#endif /* MEASURE_FULL_TIME */
}
/* Напечатать время от старта и от последнего вызова с заголовком MESSAGE */
void print_full_time (const char *message)
{
  long t;
  TIMER summ, stage;

#ifdef MEASURE_FULL_TIME
  TIMER summ_full, stage_full;
  long t_full = get_full_time ();
#endif /* MEASURE_FULL_TIME */

  t = get_time ();

  if (TimerStarted)
    {
      ConvertTime (t - StartTime, &summ);
      ConvertTime (t - PrevTime, &stage);
#ifdef MEASURE_FULL_TIME
      ConvertTime (t_full - StartFullTime, &summ_full);
      ConvertTime (t_full - PrevFullTime, &stage_full);
#endif /* MEASURE_FULL_TIME */
#ifdef MEASURE_FULL_TIME
      printf("Time: total=%2.2d:%2.2d:%2.2d.%2.2d (%2.2d:%2.2d:%2.2d.%2.2d), %s=%2.2d:%2.2d:%2.2d.%2.2d (%2.2d:%2.2d:%2.2d.%2.2d)\n",
	      summ.hour, summ.min, summ.sec, summ.tic,
	      summ_full.hour, summ_full.min, summ_full.sec, summ_full.tic,
	      message,
	      stage.hour, stage.min, stage.sec, stage.tic,
	      stage_full.hour, stage_full.min, stage_full.sec, stage_full.tic);
      PrevFullTime = t_full;
#else
      printf("Time: total=%2.2d:%2.2d:%2.2d.%2.2d, %s=%2.2d:%2.2d:%2.2d.%2.2d\n",
	      summ.hour, summ.min, summ.sec, summ.tic, message,
	      stage.hour, stage.min, stage.sec, stage.tic);
#endif /* MEASURE_FULL_TIME */
      PrevTime = t;
    }
  else
    {
      TimerStarted = 1;
      StartTime = PrevTime = t;
#ifdef MEASURE_FULL_TIME
      StartFullTime = PrevFullTime = t_full;
#endif /* MEASURE_FULL_TIME */
    }
}
Beispiel #3
0
/*
static void Print_start_data (const double *msr_matrix, const int *indexes, const int n, const int nz, const double *rhs, const int my_rank)
{
  // Print matrix as arrays MSR ans INDEX
  print_msr_NF (msr_matrix, indexes, nz, my_rank);
  // Print rhs
  printf ("rhs = ");
  print_vector (rhs, n, my_rank);
}
*/
void *msr_solver (void* args)
{
  // class matrix arguments
  matrix_args *m_args = (matrix_args*)args;
  int my_rank = m_args->get_my_rank ();
  int total_thread = m_args->get_total_thread ();

  // iteration definition
  constexpr int maxit = 50;
  constexpr int globalmaxit = 300;
  constexpr double eps = 1e-4;
  int iter = 0;
  int glob_iter = 0;

  double *msr_matrix = m_args->get_matrix ();            //< MSR matrix
  double *x = m_args->get_x ();                 //< solve
  double *rhs = m_args->get_rhs ();             //< right hand
  double *workspace = m_args->get_workspace (); //< addition workspace
  double *r = workspace;                        //< residual vector
  int *indexes = m_args->get_indexes ();        //< MSR IND vector
  const int n = m_args->get_size ();            //< size matrix
  const int width = m_args->get_width ();       //< widht of band matrix
  double residual = 0;                          // residual
  double full_time = 0;

  // create msr matrix
  create_msr_band_matrix (msr_matrix, indexes, width, n, my_rank, total_thread);

  print_msr_matrix_SF (msr_matrix, indexes, n, my_rank);

  print_msr_NF (msr_matrix, indexes, m_args->get_nozero (), my_rank);

  // symmetry matrix
  /*  int sym = 0;
  sym = is_symmetric_msr_matrix (indexes, n, my_rank);
  if (sym)
    {
      printf ("MSR not symmtetry!!!\n");
    }
*/
  // set rhs = (1,0,1,0...)
  set_rhs_vector (msr_matrix, indexes,rhs, n, my_rank, total_thread);

  // set x = (1,0,1,0...)
  set_init_solve_vector (x, n, my_rank, total_thread);

  //  Print_start_data (msr_matrix, indexes, n, nz, rhs, my_rank);

  full_time = get_full_time (); // Initialize full time

  m_args->set_thread_time (get_time ()); // Initialize time

  for (glob_iter = 0; glob_iter < globalmaxit;)
    {
      iter = minimal_residual_solver (msr_matrix, indexes, n, rhs, x, workspace,
                                      my_rank, total_thread, maxit, eps);

      if (iter < 0)
        {
          glob_iter += maxit;
          residual = get_residual (msr_matrix, indexes, n, x, rhs, r, my_rank, total_thread);
          if (my_rank == 0)
            printf("Failure:        iters = %d         residual = %4.8e\n", glob_iter, residual);
        }
      else
        break;
    }
  // Finish time
  full_time = get_full_time () - full_time;
  m_args->set_thread_time(get_time () - m_args->get_thread_time ());

  residual = get_residual (msr_matrix, indexes, n, x, rhs, r, my_rank, total_thread);

  if (my_rank == 0)
    {
      double error = 0;
      printf ("MATRIX: %s\nResidual  =  %e        Error  =  %e\nFull_time  =   %f\n", "no-file", residual, error, full_time);
    }

  printf ("Thread   # %d  ------------------- CPU_thread_time = %f\n", my_rank, m_args->get_thread_time ());
  synchronize (total_thread);
  return 0;
}
Beispiel #4
0
int main(int argc, char *argv[]){
    int mode=0;
	int n = 1;
	int t = 3;
	int max = 10;
	double *A;
    double *b;
	double t1;
	FILE* input;
	int ret = 0;
	opterr = 0;
	while ((ret = getopt( argc, argv, "f::g:N:t:")) != -1) {
		switch (ret) {
		case 'N':
			if (optarg == NULL) return -1;
			max = atoi(optarg);
			printf("максимальный выходной размер: %d\n", max);
			break;
		case 't':
			if (optarg == NULL) return -1;
			t = atoi(optarg);
			break;		
		case 'f':
			mode = 1;
			if (optarg != NULL){
				printf ("ввод из файла %s\n", optarg);
				if ((input = fopen (optarg, "r")) == NULL) {
					perror ("невозможно открыть файл\n");
					return -1;
				}
			} else {
				printf ("ввод из файла input.txt\n");
				if ((input = fopen ("input.txt", "r")) == NULL) {
					perror ("невозможно открыть файл\n");
					return -1;
				}
			}
			break;
		case 'g':
			if (mode == 1) break;
			if (optarg == NULL) return -1;
			printf("ввод из функции\n");
			mode = 2;
			n = atoi(optarg);
			printf("матрица размера: %d\n", n);
			break;
		case '?':
			printf("неизвестная опция -%c\n", optopt);
			printf("поддерживаемые опции:\n");
			printf("f - ввод матрицы из файла, являющегося аргументом, или, если аргумента нет, ввод матрицы из файла input.txt;\n");
			printf("g - ввод матрицы из функции. Аргумент функции (обязателен) является размером матрицы;\n");
			printf("t - количество нитей;\n");
			printf("N - максимальный выходной размер.\n");
			return -1;
		}
	}
	printf("Используется %d нитей.\n", t); 	
	if (mode == 1){
		if(fscanf (input, "%d", &n) == 0){
			printf ("не получилось сосканировать размер матрицы из файла\n");	
			return -1;
		}
		A = new double [n*(n+1)];
		if (A == NULL){
			printf("не удалось выделить память под матрицу А\n");
			return -1;
		}
		if (file_input(input, n, A) != 0){
			return -1;
		}			
		fclose(input);
	} else if (mode == 2){
		A = new double [n*(n+1)];
		if (func_input(A, n) != 0){
			return -1;
		}
	} else {
		printf("Требуется запустить программу с какими-либо параметрами\n");
		printf("Поддерживаемые параметры запуска:\n");
		printf("f - ввод матрицы из файла, являющегося аргументом, или, если аргумента нет, ввод матрицы из файла input.txt;\n");
		printf("g - ввод матрицы из функции. Аргумент функции (обязателен) является размером матрицы;\n");
		printf("t - количество нитей;\n");
		printf("N - опция, аргумент которой (обязателен) задает максимальный выходной размер.\n");
		return -1;
	}
	pthread_t *threads = new pthread_t [t];                     //инициализируем нити, выделяем под них память
	if (threads == NULL){
		printf("не удалось выделить память под массив нитей\n");
		return -1;
	}
	b = new double [n];
	if (b == NULL){
		printf("не удалось выделить память под вектор b\n");
		return -1;
	}
    for (int z=0;z<n;z++){
        b[z] = -A[z*(n+1)+n];
    }
   	int MAX_OUTPUT_SIZE = 10;

   	PrintMatrix(n, A, b, MAX_OUTPUT_SIZE);
	delete []b;
	printf("\n");	
	
	FILE *out;
	out = fopen("output.txt", "wr");
	if(out == NULL){
		printf("не могу открыть выходной файл\n");
		return -1;
	}
	
	double *x = new double [n];                    //сюда пишем решение
	if (x == NULL){
		printf("не удалось выделить память под вектор x\n");
		return -1;
	}
	double *E = new double [(n+1)*(n+1)];          //здесь будут храниться базисы
	if (E == NULL){
		printf("не удалось выделить память под матрицу Е\n");
		return -1;
	}
	solve *args = new solve [t];                   //массив структур для нитей
	if (args == NULL){
		printf("не удалось выделить память под аргументы нитей\n");
		return -1;
	}
	double *v = new double [n+1];                  //сюда запоминается вектор для master
	if (v == NULL){
		printf("не удалось выделить память под вектор v\n");
		return -1;
	}
	printf("\nрешение системы...\n");
	t1 = get_full_time();                         //get_full_time для счета астрономического времени
	Solve(n,A,x,t,threads,E,args,v);
	t1 = get_full_time() - t1;
	
	Nevyaska * arg = new Nevyaska [t];
	if (args == NULL){
		printf("не удалось выделить память под структуру значений для невязки\n");
		return -1;
	}
	printf("\n");
	file_output(out,n,max,x);
	printf("время решения системы = %f\n", t1);
	printf("\nподсчет невязки...\n");
	printf("невязка = %e\n", nev(n,A,x,t,threads,arg));
	if (mode == 2){
		printf("норма погрешности = %e\n", error_rate(n,x));
	}	
	delete []A;
	delete []x;
	delete []E;
	delete []v;
	delete []args;
	delete []threads;
	delete []arg;
	fclose(out); 
	return 0;
}
Beispiel #5
0
int main(int argc, char * argv[])
{
    pthread_t *tid;//number of thread
    args *arg;
    int total_processes;
    double *a, *b, *x;
    int res1, res2;
    long int t;
    int n;
    int N;
    int i;
    char * filename = 0;
    const char * name = "c.txt";
    if( argc != 3 && argc != 4 )
    {
        printf("Usage : %s <n> <total_processes> <filename>\n", argv[0]);
        return 0;
    }
    n = atoi(argv[1]);//from number to string
    total_processes = atoi (argv[2]);
    if(!n || !total_processes)
    {
        printf("Usage : %s <n> <total_processes> <filename>\n", argv[0]);
        return 0;
    }
    a = new double[n*n];
    b = new double[n];
    x = new double[n];
    tid = new pthread_t[total_processes];
    arg = new args[total_processes];
    if(argc > 3)
        filename = argv[3];

    if(filename)
    {
        res1 = read_matrix(a, n, "a.txt");
        res2 = read_vector(b, n, "b.txt");
        if(res1 || res2)
        {
            printf("cannot read from file\n");
            delete [] tid;
            delete [] arg;
            delete [] a;
            delete [] b;
            delete [] x;
            return 1;
        }
    }
    else
    {
        init_matrix(a, n);
        init_vector(b, a, n);
    }
    printf("matrix A:\n");
    print_matrix(a, n);
    printf("vector b:\n");
    print_vector(b, n);

    for (i = 0; i < total_processes; i++)
    {
        arg[i].a = a;
        arg[i].b = b;
        arg[i].n = n;
        arg[i].total_processes = total_processes;
        arg[i].num_process = i;
        arg[i].error = 0;
    }

    t = get_full_time ();
    for (i = 0; i < total_processes; i++)
    {
        if (pthread_create (tid + i, 0, &thread_method_of_reflections, arg + i))
        {
            printf ("Cannot create thread %d\n", i);
            return 2;
        }
    }
    for (i = 0; i < total_processes; i++)
        pthread_join (tid[i], 0);
    back_hod(a, b, x, n);
    t = get_full_time () - t;
    N = (n < MAX_N) ? n : MAX_N;
    printf("result : ");
    for(i = 0; i < N; i++)
        printf("%lg ", x[i]);
	printvectorfile(x,n,name);
     if(filename)
    {
        read_matrix(a, n, "a.txt");
        read_vector(b, n, "b.txt");
        printf("\nResidual = %le\nElapsed time = %Lg\n",SolutionError(n,a,b,x),(long double)t/(CLOCKS_PER_SEC));
    }
    else
    {
        init_matrix(a, n);
        init_vector(b, a, n);
        printf("\nResidual = %le\nError = %le\nElapsed time = %Lg\n",SolutionError(n,a,b,x), SolutionAccuracy(n,x),(long double)t/(CLOCKS_PER_SEC));
    }
    delete [] tid;
    delete [] arg;
    delete [] a;
    delete [] b;
    delete [] x;
    return 0;
}