PAS D'ERREURS SUR >100 EXEC. ÉCONOMIE MAX (VERTEX, LIGNES). À TESTER ET OPTIMISER.

This commit is contained in:
Jean Sirmai 2023-10-21 11:34:43 +02:00
parent 89c593ad38
commit e58d86a58f
Signed by: jean
GPG Key ID: FB3115C340E057E3
3 changed files with 83 additions and 34 deletions

View File

@ -43,6 +43,7 @@ void print_user_action(struct arrow_t *arrows, int arrows_nb, int address, int r
void print_user_choices(struct arrow_t *arrows, int arrows_nb, void print_user_choices(struct arrow_t *arrows, int arrows_nb,
int space_size_x, int space_size_y, int space_size_z, int space_size_x, int space_size_y, int space_size_z,
int show_array, int show_space_design); int show_array, int show_space_design);
void print_evolution (struct arrow_t *arrows, int arrows_nb, int modified, int deleted, int show_array);
/* /*
* Prints the initial user choices : * Prints the initial user choices :
* - space dimension size and appearance (grids) * - space dimension size and appearance (grids)

View File

@ -58,15 +58,30 @@ void print_user_choices(struct arrow_t *arrows, int arrows_nb,
int space_size_x, int space_size_y, int space_size_z, int space_size_x, int space_size_y, int space_size_z,
int show_array, int show_space_design) int show_array, int show_space_design)
{ {
printf("model + user constraints :\tspace size x,y,z = %d,%d,%d\tarrows nb = %d\t",\ printf("model + user constraints :\tspace size x,y,z (%3d,%3d,%3d)\tarrows nb : %6d\t",\
space_size_x, space_size_y, space_size_z, arrows_nb); space_size_x, space_size_y, space_size_z, arrows_nb);
if (show_space_design) printf("orientations grilles alternées"); if (show_space_design) printf(" (grilles alternées)");
printf("\n"); printf("\n");
if (show_array) print_arrows_array (arrows, arrows_nb); if (show_array) print_arrows_array (arrows, arrows_nb);
} }
/* Prints the evolution after adding / removing arrows :
* - arrows[] array
* NB The space may be empty or saturated with arrows or any value in between
* Only one arrow per possible coordinates with a load max equal to ? TODO
*
*
* print_evolution (arrows, added, mem, deleted, print_arrows_data);
*/
void print_evolution (struct arrow_t *arrows, int arrows_nb, int modified, int deleted, int show_array)
{
printf("evolution\t\t\t\t\t\t\tarrows nb > %6d\t (%d added / %d deleted) (modified : %d)\n",\
arrows_nb + modified - deleted * 2, modified - deleted, deleted, modified);
if (show_array) print_arrows_array (arrows, arrows_nb);
}
/* /*
* Prints the arrows[] array * Prints the arrows[] array
* *

View File

@ -627,6 +627,8 @@ static inline int set_arrow (struct arrow_t *arrows, int arrows_nb, int requeste
{ {
int address = -1, current_weight = -1; int address = -1, current_weight = -1;
#pragma omp parallel schedule(static, 12)
{
for (int i = 0; i < arrows_nb; i++) { for (int i = 0; i < arrows_nb; i++) {
if ((site == arrows[i].site) if ((site == arrows[i].site)
&& (x == arrows[i].x) && (x == arrows[i].x)
@ -638,7 +640,7 @@ static inline int set_arrow (struct arrow_t *arrows, int arrows_nb, int requeste
break; break;
} }
} }
}
//printf("\n[%d]set_arrow() invoked with requested weight = %2d + ", arrows_nb, requested_weight); //printf("\n[%d]set_arrow() invoked with requested weight = %2d + ", arrows_nb, requested_weight);
if (TEST) show_user_action(arrows, arrows_nb, address, requested_weight, current_weight, site, x, y, z); if (TEST) show_user_action(arrows, arrows_nb, address, requested_weight, current_weight, site, x, y, z);
@ -673,11 +675,12 @@ void __attribute__((optimize("no-unroll-loops"))) main_test_graphics (void)
// assert : no more than one arrow per address // assert : no more than one arrow per address
// notify : weights are replaced, NOT added (could be !) // notify : weights are replaced, NOT added (could be !)
struct timespec ts;
srand(time(NULL)); // Initialisation du générateur pseudo-aléatoire srand(time(NULL)); // Initialisation du générateur pseudo-aléatoire
int rand(void); int rand(void);
void srand(unsigned int seed); // printf ("Valeur max : %d\n", RAND_MAX); min + rand() % (max+1 - min); void srand(unsigned int seed); // printf ("Valeur max : %d\n", RAND_MAX); min + rand() % (max+1 - min);
int arbitrary = 0; int arbitrary = 200;
int space_X = 1 + rand() % arbitrary, int space_X = 1 + rand() % arbitrary,
space_Y = 1 + rand() % arbitrary, space_Y = 1 + rand() % arbitrary,
space_Z = 1 + rand() % arbitrary; space_Z = 1 + rand() % arbitrary;
@ -687,37 +690,48 @@ void __attribute__((optimize("no-unroll-loops"))) main_test_graphics (void)
int show_space_design = 1, print_arrows_data = 0; int show_space_design = 1, print_arrows_data = 0;
int load = 0, site = 0, x = 0, y = 0, z = 0; int load = 0, site = 0, x = 0, y = 0, z = 0;
int specif_arrows_nb = rand() % density_max / 3; int specif_arrows_nb = rand() % density_max;
int arrows_nb = 0; int arrows_nb = 0, cpt = 0, t_initial = 0;
/* while (arrows_nb < specif_arrows_nb){ */ clock_gettime(CLOCK_REALTIME, &ts); t_initial = ts.tv_sec;
/* arrows_nb = set_arrow (arrows, arrows_nb, */ printf("%10d | ", specif_arrows_nb / 1000);
/* rand() % arbitrary + 1, // load / weight */ #pragma omp parallel
/* rand() % 6, // site, */ {
/* rand() % space_X, // x */ while (arrows_nb < specif_arrows_nb){
/* rand() % space_Y, // y */ arrows_nb = set_arrow (arrows, arrows_nb,
/* rand() % space_Z); // z */ rand() % arbitrary + 1, // load / weight
/* } */ rand() % 6, // site,
rand() % space_X, // x
rand() % space_Y, // y
rand() % space_Z); // z
/* clock_gettime(CLOCK_REALTIME, &ts); < Je n'arrive pas à afficher les temps en cours d'exécutuion */
/* if (arrows_nb % 1000 == 0) {cpt++; printf("%8d", arrows_nb / 1000); if (cpt % 22 == 0) printf(" %f\n%10d | ", specif_arrows_nb / 1000, ts.tv_sec - t_initial);} */
if (arrows_nb % 1000 == 0) {cpt++; printf("%8d", arrows_nb / 1000); if (cpt % 24 == 0) printf("\n%10d | ", specif_arrows_nb / 1000);}
}
printf("\n");
}
// clock_t start, end; // clock_t start, end;
/* Recording the starting clock tick.*/ /* Recording the starting clock tick.*/
// start = clock(); // start = clock();
arbitrary = 24; /* arbitrary = 26; */
space_X = arbitrary; space_Y = arbitrary; space_Z = arbitrary; /* space_X = arbitrary; space_Y = arbitrary; space_Z = arbitrary; */
density_max = space_X * space_Y * space_Z; /* density_max = space_X * space_Y * space_Z;
for (int i =0; i < space_X; i++) * C E T T E T R I P L E B O U C L E
for (int j =0; j < space_Y; j++) * S A T U R E L ' E S P A C E S Y S T É M A T I Q U E M E N T */
for (int k =0; k < space_Z; k++) /* for (int i =0; i < space_X; i++) */
for (int u =0; u < 6; u++) /* for (int j =0; j < space_Y; j++) */
arrows_nb = set_arrow (arrows, arrows_nb, /* for (int k =0; k < space_Z; k++) */
1, // load / weight /* for (int u =0; u < 6; u++) */
u,//i % 6, // site, /* arrows_nb = set_arrow (arrows, arrows_nb, */
i,//i % space_X, // x /* 1, // load / weight */
j,//i % space_Y, // y /* u,//i % 6, // site, */
k//i % space_Z); /* i,//i % space_X, // x */
); /* j,//i % space_Y, // y */
/* k//i % space_Z); */
/* ); */
// end = clock(); printf("Elapsed time %ld\n", end - start); // end = clock(); printf("Elapsed time %ld\n", end - start);
print_user_choices(arrows, arrows_nb, space_X, space_Y, space_Z, print_arrows_data, show_space_design); print_user_choices(arrows, arrows_nb, space_X, space_Y, space_Z, print_arrows_data, show_space_design);
@ -737,13 +751,13 @@ void __attribute__((optimize("no-unroll-loops"))) main_test_graphics (void)
offset_vertex += write_space_ridges_vertex (offset_vertex, offset_colors, offset_lines, space_X, space_Y, space_Z); offset_vertex += write_space_ridges_vertex (offset_vertex, offset_colors, offset_lines, space_X, space_Y, space_Z);
offset_colors = offset_vertex; offset_colors = offset_vertex;
if (1) printf("offset_vertex after writing_space_ridges_vertex : %d (x 3 = %d)\n\n", offset_vertex, offset_vertex * 3); if (0) printf("offset_vertex after writing_space_ridges_vertex : %d (x 3 = %d)\n\n", offset_vertex, offset_vertex * 3);
offset_vertex += write_grids_on_space_faces_vertex (offset_vertex, offset_colors, offset_lines, space_X, space_Y, space_Z, show_space_design); offset_vertex += write_grids_on_space_faces_vertex (offset_vertex, offset_colors, offset_lines, space_X, space_Y, space_Z, show_space_design);
offset_colors = offset_vertex; offset_colors = offset_vertex;
if (1) printf("offset_vertex after writing_space_faces_vertex = %4d - 8 = %3d (x 3 = %4d)\n", offset_vertex, offset_vertex - 8, (offset_vertex - 8) * 3); if (0) printf("offset_vertex after writing_space_faces_vertex = %4d - 8 = %3d (x 3 = %4d)\n", offset_vertex, offset_vertex - 8, (offset_vertex - 8) * 3);
if (1) printf("(space_X - 1) * 4 + (space_Y - 1) * 4 + (space_Z - 1) * 4 = %3d (x 3 = %4d)\n\n",\ if (0) printf("(space_X - 1) * 4 + (space_Y - 1) * 4 + (space_Z - 1) * 4 = %3d (x 3 = %4d)\n\n",\
(space_X - 1) * 4 + (space_Y - 1) * 4 + (space_Z - 1) * 4, ((space_X - 1) * 4 + (space_Y - 1) * 4 + (space_Z - 1) * 4) * 3); (space_X - 1) * 4 + (space_Y - 1) * 4 + (space_Z - 1) * 4, ((space_X - 1) * 4 + (space_Y - 1) * 4 + (space_Z - 1) * 4) * 3);
@ -762,7 +776,7 @@ void __attribute__((optimize("no-unroll-loops"))) main_test_graphics (void)
offset_colors = offset_vertex; offset_colors = offset_vertex;
} }
if (1) printf("offset_vertex after writing_arrows_vertex : %d (x 3 = %d) (arrows_nb = %d)\n", offset_vertex, offset_vertex * 3, arrows_nb); if (0) printf("offset_vertex after writing_arrows_vertex : %d (x 3 = %d) (arrows_nb = %d)\n", offset_vertex, offset_vertex * 3, arrows_nb);
/*---------------------------------------------------------------*/ /*---------------------------------------------------------------*/
@ -790,10 +804,29 @@ void __attribute__((optimize("no-unroll-loops"))) main_test_graphics (void)
load, site, x, y, z); load, site, x, y, z);
} }
assert : arrows_nb > arbitrary;
int random_choice, modified = 0, deleted = 0;
#pragma omp parallel
{
while (modified < arbitrary) {
random_choice = rand() % 6;
if (random_choice == 0) deleted++;
modified = set_arrow (arrows, modified,
random_choice, // load / weight
rand() % 6, // site,
rand() % space_X, // x
rand() % space_Y, // y
rand() % space_Z); // z
}
}
print_evolution (arrows, arrows_nb, arbitrary, deleted, print_arrows_data);
// ? free (space) TODO // ? free (space) TODO
free(arrows); free(arrows);
arrows = NULL; arrows = NULL;
arrows_nb = 0; arrows_nb = 0;
} }