Commit 43d89656 authored by Pavel Kus's avatar Pavel Kus

parameters can be saved

parent a87ab950
...@@ -153,7 +153,8 @@ module elpa_api ...@@ -153,7 +153,8 @@ module elpa_api
elpa_solve_tridiagonal_d, & !< matrix elpa_solve_tridiagonal_d, & !< matrix
elpa_solve_tridiagonal_f elpa_solve_tridiagonal_f
procedure(print_all_parameters_i), deferred, public :: print_all_parameters !< method to set the best options procedure(print_all_parameters_i), deferred, public :: print_all_parameters !< method to print all parameters
procedure(save_all_parameters_i), deferred, public :: save_all_parameters !< method to save all parameters
#ifdef ENABLE_AUTOTUNING #ifdef ENABLE_AUTOTUNING
! Auto-tune ! Auto-tune
procedure(elpa_autotune_setup_i), deferred, public :: autotune_setup !< method to prepare the ELPA autotuning procedure(elpa_autotune_setup_i), deferred, public :: autotune_setup !< method to prepare the ELPA autotuning
...@@ -262,6 +263,21 @@ module elpa_api ...@@ -262,6 +263,21 @@ module elpa_api
end subroutine end subroutine
end interface end interface
!> \brief abstract definition of the save_all_parameters method
!> Parameters
!> \details
!> \param self class(elpa_t): the ELPA object, which should be tuned
!> \param file_name string, the name of the file where to save the parameters
!> Saves all the elpa parameters
abstract interface
subroutine save_all_parameters_i(self, file_name)
import elpa_t
implicit none
class(elpa_t), intent(inout) :: self
character(*), intent(in) :: file_name
end subroutine
end interface
#ifdef ENABLE_AUTOTUNING #ifdef ENABLE_AUTOTUNING
!> \brief abstract definition of the autotune setup method !> \brief abstract definition of the autotune setup method
!> Parameters !> Parameters
......
...@@ -156,6 +156,7 @@ module elpa_impl ...@@ -156,6 +156,7 @@ module elpa_impl
#endif #endif
procedure, public :: print_all_parameters => elpa_print_all_parameters procedure, public :: print_all_parameters => elpa_print_all_parameters
procedure, public :: save_all_parameters => elpa_save_all_parameters
#ifdef ENABLE_AUTOTUNING #ifdef ENABLE_AUTOTUNING
procedure, public :: autotune_setup => elpa_autotune_setup procedure, public :: autotune_setup => elpa_autotune_setup
procedure, public :: autotune_step => elpa_autotune_step procedure, public :: autotune_step => elpa_autotune_step
...@@ -1097,12 +1098,28 @@ module elpa_impl ...@@ -1097,12 +1098,28 @@ module elpa_impl
class(elpa_impl_t), intent(inout) :: self class(elpa_impl_t), intent(inout) :: self
!print *, "The following parameters have been set" !print *, "The following parameters have been set"
if (elpa_index_print_all_parameters_c(self%index) /= 1) then if (elpa_index_print_all_parameters_c(self%index, c_null_char) /= 1) then
stop "This should not happen (in elpa_print_all_parameters())" stop "This should not happen (in elpa_print_all_parameters())"
endif endif
end subroutine end subroutine
!> \brief function to save all the parameters, that have been set
!> Parameters
!> \param self class(elpa_impl_t) the allocated ELPA object
!> \param file_name string, the name of the file where to save the parameters
subroutine elpa_save_all_parameters(self, file_name)
implicit none
class(elpa_impl_t), intent(inout) :: self
character(*), intent(in) :: file_name
!print *, "The following parameters have been set"
if (elpa_index_print_all_parameters_c(self%index, file_name // c_null_char) /= 1) then
stop "This should not happen (in elpa_save_all_parameters())"
endif
end subroutine
!> \brief function to print the state of the autotuning !> \brief function to print the state of the autotuning
!> Parameters !> Parameters
!> \param self class(elpa_impl_t) the allocated ELPA object !> \param self class(elpa_impl_t) the allocated ELPA object
......
...@@ -1033,11 +1033,6 @@ int elpa_index_print_autotune_state(elpa_index_t index, int autotune_level, int ...@@ -1033,11 +1033,6 @@ int elpa_index_print_autotune_state(elpa_index_t index, int autotune_level, int
int min_loc_cpy = min_loc; int min_loc_cpy = min_loc;
FILE *f; FILE *f;
if(file_name == "")
f = stdout;
else
f = fopen(file_name, "w");
// get index with the currently best parameters // get index with the currently best parameters
index_best = elpa_index_instance(); index_best = elpa_index_instance();
...@@ -1054,7 +1049,19 @@ int elpa_index_print_autotune_state(elpa_index_t index, int autotune_level, int ...@@ -1054,7 +1049,19 @@ int elpa_index_print_autotune_state(elpa_index_t index, int autotune_level, int
} }
int is_process_id_zero = elpa_index_get_int_value(index, "is_process_id_zero", NULL); int is_process_id_zero = elpa_index_get_int_value(index, "is_process_id_zero", NULL);
if (is_process_id_zero) { if (is_process_id_zero) {
if(file_name == "") int output_to_file = (strlen(file_name) > 0);
if(output_to_file) {
f = fopen(file_name, "w");
if(f == NULL){
fprintf(stderr, "Cannot open file %s in elpa_index_print_autotune_state\n", file_name);
return 0;
}
}
else {
f = stdout;
}
if(!output_to_file)
fprintf(f, "\n"); fprintf(f, "\n");
fprintf(f, "*** AUTOTUNING STATE ***\n"); fprintf(f, "*** AUTOTUNING STATE ***\n");
fprintf(f, "** This is the state of the autotuning object\n"); fprintf(f, "** This is the state of the autotuning object\n");
...@@ -1083,18 +1090,21 @@ int elpa_index_print_autotune_state(elpa_index_t index, int autotune_level, int ...@@ -1083,18 +1090,21 @@ int elpa_index_print_autotune_state(elpa_index_t index, int autotune_level, int
fprintf(f, "** No output after first step\n"); fprintf(f, "** No output after first step\n");
} }
fprintf(f, "*** END OF AUTOTUNING STATE ***\n"); fprintf(f, "*** END OF AUTOTUNING STATE ***\n");
if(output_to_file)
fclose(f);
} }
elpa_index_free(index_best); elpa_index_free(index_best);
if(file_name != "")
fclose(f);
return 1; return 1;
} }
int elpa_index_print_all_parameters(elpa_index_t index) { int elpa_index_print_all_parameters(elpa_index_t index, char *file_name) {
const int LEN =10000; const int LEN =10000;
char out_structure[LEN], out_set[LEN], out_defaults[LEN], out_nowhere[LEN], buff[100]; char out_structure[LEN], out_set[LEN], out_defaults[LEN], out_nowhere[LEN], buff[100];
char (*out)[LEN]; char (*out)[LEN];
FILE *f;
sprintf(out_structure, "Parameters describing structure of the computation:\n"); sprintf(out_structure, "Parameters describing structure of the computation:\n");
sprintf(out_set, "Parameters explicitly set by the user:\n"); sprintf(out_set, "Parameters explicitly set by the user:\n");
sprintf(out_defaults, "Parameters with default or environment value:\n"); sprintf(out_defaults, "Parameters with default or environment value:\n");
...@@ -1113,9 +1123,24 @@ int elpa_index_print_all_parameters(elpa_index_t index) { ...@@ -1113,9 +1123,24 @@ int elpa_index_print_all_parameters(elpa_index_t index) {
elpa_index_print_int_parameter(index, buff, i); elpa_index_print_int_parameter(index, buff, i);
sprintf(*out, "%s%s", *out, buff); sprintf(*out, "%s%s", *out, buff);
} }
fprintf(stdout, "*** ELPA STATE ***\n"); int output_to_file = (strlen(file_name) > 0);
fprintf(stdout, "%s\n%s\n%s", out_structure, out_set, out_defaults); if(output_to_file) {
fprintf(stdout, "*** END OF ELPA STATE ***\n"); f = fopen(file_name, "w");
if(f == NULL){
fprintf(stderr, "Cannot open file %s in elpa_index_print_all_parameters\n", file_name);
return 0;
}
} }
else {
f = stdout;
}
fprintf(f, "*** ELPA STATE ***\n");
fprintf(f, "%s\n%s\n%s", out_structure, out_set, out_defaults);
fprintf(f, "*** END OF ELPA STATE ***\n");
if(output_to_file)
fclose(f);
}
return 1; return 1;
} }
...@@ -437,16 +437,17 @@ int elpa_index_print_autotune_parameters(elpa_index_t index, int autotune_level, ...@@ -437,16 +437,17 @@ int elpa_index_print_autotune_parameters(elpa_index_t index, int autotune_level,
/* /*
!f> interface !f> interface
!f> function elpa_index_print_all_parameters_c(index) result(success) & !f> function elpa_index_print_all_parameters_c(index, file_name) result(success) &
!f> bind(C, name="elpa_index_print_all_parameters") !f> bind(C, name="elpa_index_print_all_parameters")
!f> import c_int, c_ptr, c_char !f> import c_int, c_ptr, c_char
!f> type(c_ptr), intent(in), value :: index !f> type(c_ptr), intent(in), value :: index
!f> character(kind=c_char), intent(in) :: file_name(*)
!f> integer(kind=c_int) :: success !f> integer(kind=c_int) :: success
!f> end function !f> end function
!f> end interface !f> end interface
!f> !f>
*/ */
int elpa_index_print_all_parameters(elpa_index_t index); int elpa_index_print_all_parameters(elpa_index_t index, char* filename);
/* /*
!f> interface !f> interface
......
...@@ -220,6 +220,7 @@ program test ...@@ -220,6 +220,7 @@ program test
iter=iter+1 iter=iter+1
write(iter_string,'(I5.5)') iter write(iter_string,'(I5.5)') iter
call e%print_all_parameters() call e%print_all_parameters()
call e%save_all_parameters("saved_parameters_"//trim(iter_string)//".txt")
call e%timer_start("eigenvectors: iteration "//trim(iter_string)) call e%timer_start("eigenvectors: iteration "//trim(iter_string))
call e%eigenvectors(a, ev, z, error) call e%eigenvectors(a, ev, z, error)
call e%timer_stop("eigenvectors: iteration "//trim(iter_string)) call e%timer_stop("eigenvectors: iteration "//trim(iter_string))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment