/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        V E R I F I C A T I O N   D E   L A   M E M O I R E   P H Y S I Q U E  :                                                   */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xcg/CheckMem$vv$K' :                                                                                           */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20031111102432).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R F A C E   ' listG '  :                                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        :Debut_listG:                                                                                                              */
/*        :Fin_listG:                                                                                                                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I R E C T I V E S   S P E C I F I Q U E S   D E   C O M P I L A T I O N  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
@define   PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES
                                        /* Introduit le 20061114154342 (car tres utile dans '$xE'...).                               */
@define   PRAGMA_CL_____PAS_DE_FICHIER_____PARAM
                                        /* Introduit le 20170416093259 a cause de l'argument 'taille_de_la_memoire_en_octets'        */
                                        /* qui est local a chaque MACHINE ('v $xcg/CheckMem$vv$K MemorySizeMB')...                   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F I C H I E R S   D ' I N C L U D E S  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  INCLUDES_MINI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   TESTER_DE_FACON_INCREMENTALE                                                                                                  \
                    VRAI
#define   TESTER_AVEC_DES_PATTERNS                                                                                                      \
                    VRAI
                                        /* Choix des modes de test. Les tests incrementaux ont ete introduits le 20051210104215...   */

#if       (SYSTEME_32_64_BITS==SYSTEME_32_BITS)
                                        /* Test introduit le 20111114183228, en particulier, a cause de '$LACT19'...                 */
#    define    PATTERN_1                                                                                                                \
                         0x00000000
#    define    PATTERN_2                                                                                                                \
                         0xffffffff
#    define    PATTERN_3                                                                                                                \
                         0x55555555
#    define    PATTERN_4                                                                                                                \
                         0xaaaaaaaa
                                        /* "Patterns" utiles a priori.                                                               */
#Aif      (SYSTEME_32_64_BITS==SYSTEME_32_BITS)
#Eif      (SYSTEME_32_64_BITS==SYSTEME_32_BITS)

#if       (SYSTEME_32_64_BITS==SYSTEME_64_BITS)
                                        /* Test introduit le 20111114183228, en particulier, a cause de '$LACT19'...                 */
#    define    PATTERN_1                                                                                                                \
                         0x0000000000000000
#    define    PATTERN_2                                                                                                                \
                         0xffffffffffffffff
#    define    PATTERN_3                                                                                                                \
                         0x5555555555555555
#    define    PATTERN_4                                                                                                                \
                         0xaaaaaaaaaaaaaaaa
                                        /* "Patterns" utiles a priori.                                                               */
#Aif      (SYSTEME_32_64_BITS==SYSTEME_64_BITS)
#Eif      (SYSTEME_32_64_BITS==SYSTEME_64_BITS)

#define   NOMBRE_D_ITERATIONS                                                                                                           \
                    UN                                                                                                                  \
                                        /* Nombre d'iterations du test.                                                              */

#define   TAILLE_DE_LA_MEMOIRE_EN_OCTETS                                                                                                \
                    AINT(PRENDRE_UN_POURCENTAGE(MEG2(sHOTE_____TAILLE_DE_LA_MEMOIRE_EN_MEGA_OCTETS)                                     \
                                               ,sHOTE_____TAILLE_DE_LA_MEMOIRE_DE_REFERENCE_EN_MEGA_OCTETS                              \
                                                )                                                                                       \
                         )                                                                                                              \
                                        /* Taille de la memoire a tester en octets.                                                  */ \
                                        /*                                                                                           */ \
                                        /* Le 20061023155856 'POURCENTAGE(...)' fut remplace par 'PRENDRE_UN_POURCENTAGE(...)'.      */ \
                                        /*                                                                                           */ \
                                        /* Le 20090319083808, 'MemorySizeMB' fut recuperee via la variable '$MemorySizeMB' de facon  */ \
                                        /* a pouvoir changer cette valeur dynamiquement...                                           */ \
                                        /*                                                                                           */ \
                                        /* Le 20120131165034, 'QUATRE_VINGT' fut remplace par l'acces a '$PCtMemorySizeMB', puis     */ \
                                        /* par '$PCMemorySizeMB' le 20120201091847...                                                */ \
                                        /*                                                                                           */ \
                                        /* Le 20120131180305, le 'FLOT(...)' de 'FLOT(Gval("MemorySizeMB"))' a ete supprime...       */ \
                                        /*                                                                                           */ \
                                        /* Le 20120201104921, 'VALEUR_PAR_DEFAUT_DE_PCMemorySizeMB' a ete introduit...               */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   TAILLE_DE_LA_MEMOIRE_EN_Int                                                                                                   \
                    DIVI(taille_testable_de_la_memoire_en_octets,NOCMO)                                                                 \
                                        /* Nombre de 'Int' testes...                                                                 */

#define   ACCES_MEMOIRE(index)                                                                                                          \
                    IdTb1(memoire                                                                                                       \
                         ,INDX(index,PREMIERE_ITERATION_D_UN_Repe)                                                                      \
                         ,TAILLE_DE_LA_MEMOIRE_EN_Int                                                                                   \
                          )                                                                                                             \
                                        /* Acces a la memoire...                                                                     */

#define   TEST_D_UNE_PATTERN(pattern)                                                                                                   \
                    Bblock                                                                                                              \
                    DEFV(Logical,INIT(tout_s_est_bien_passe,VRAI));                                                                     \
                                        /* A priori, tout va bien...                                                                 */ \
                                                                                                                                        \
                    Repe(TAILLE_DE_LA_MEMOIRE_EN_Int)                                                                                   \
                         Bblock                                                                                                         \
                         EGAL(ACCES_MEMOIRE(compteur_des_repetitions_du_Repe),pattern);                                                 \
                                        /* Ecriture de la "pattern" dans toute la memoire...                                         */ \
                         Eblock                                                                                                         \
                    ERep                                                                                                                \
                                                                                                                                        \
                    Repe(TAILLE_DE_LA_MEMOIRE_EN_Int)                                                                                   \
                         Bblock                                                                                                         \
                         Test(IFNE(ACCES_MEMOIRE(compteur_des_repetitions_du_Repe),pattern))                                            \
                                        /* Lecture de la "pattern" dans toute la memoire et verification...                          */ \
                              Bblock                                                                                                    \
                              EGAL(tout_s_est_bien_passe,FAUX);                                                                         \
                                        /* Il y a eu au moins un probleme...                                                         */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ERep                                                                                                                \
                                                                                                                                        \
                    Test(EST_FAUX(tout_s_est_bien_passe))                                                                               \
                         Bblock                                                                                                         \
                         PRINT_ERREUR("la memoire semble en mauvais etat");                                                             \
                         CAL1(Prer1("pattern courante=%0x\n",pattern));                                                                 \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Test d'une pattern donnee.                                                                */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        V E R I F I C A T I O N   D E   L A   M E M O I R E   P H Y S I Q U E  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Logical,INIT(tester_de_facon_incrementale,TESTER_DE_FACON_INCREMENTALE));
     DEFV(Logical,INIT(tester_avec_des_patterns,TESTER_AVEC_DES_PATTERNS));
                                        /* Choix des modes de test. Les tests incrementaux ont ete introduits le 20051210104215...   */

     DEFV(Positive,INIT(pattern_1,PATTERN_1));
     DEFV(Positive,INIT(pattern_2,PATTERN_2));
     DEFV(Positive,INIT(pattern_3,PATTERN_3));
     DEFV(Positive,INIT(pattern_4,PATTERN_4));
                                        /* "Patterns" utiles a priori.                                                               */

     DEFV(Positive,INIT(nombre_d_iterations,NOMBRE_D_ITERATIONS));
                                        /* Nombre d'iterations du test.                                                              */

     DEFV(Float,INIT(taille_de_la_memoire_en_octets,TAILLE_DE_LA_MEMOIRE_EN_OCTETS));
     DEFV(Int,INIT(taille_testable_de_la_memoire_en_octets,UNDEF));
                                        /* Taille de la memoire a tester en octets.                                                  */
                                        /*                                                                                           */
                                        /* Le 20090319083808, 'taille_de_la_memoire_en_octets' est passe de 'Positive' a 'Float'     */
                                        /* a cause de la nouvelle definition de '$CMAP28' ('v $Fmachines 20090316110150' qui possede */
                                        /* 8 Go de memoire...).                                                                      */
                                        /*                                                                                           */
                                        /* Le 20090320171006, 'taille_testable_de_la_memoire_en_octets' est passe de 'Positive'      */
                                        /* a 'Int' afin de permettre le 'ABSO(...)' ci-apres...                                      */
     /*..............................................................................................................................*/
     GET_ARGUMENTS_(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_L("incremental=""increment=",tester_de_facon_incrementale);
                         GET_ARGUMENT_L("patterns=""pattern=",tester_avec_des_patterns);
                         GET_ARGUMENT_X("pattern1=""p1=",pattern_1);
                         GET_ARGUMENT_X("pattern2=""p2=",pattern_2);
                         GET_ARGUMENT_X("pattern3=""p3=",pattern_3);
                         GET_ARGUMENT_X("pattern4=""p4=",pattern_4);
                                        /* Le 20070909122035, les 'GET_ARGUMENT_X(...)'s ont remplace des 'GET_ARGUMENT_I(...)'s.    */
                         GET_ARGUMENT_I("nombre=""n=""iterations=",nombre_d_iterations);
                         PROCESS_ARGUMENT_F("taille=""t=",taille_de_la_memoire_en_octets
                                           ,BLOC(VIDE;)
                                           ,BLOC(Bblock
                                                 Test(N_EST_PAS_ENTIER(taille_de_la_memoire_en_octets))
                                                      Bblock
                                                      PRINT_ATTENTION("la taille de la memoire doit etre un nombre entier");
                                                      CAL1(Prer1("(au lieu de %f c'est ",taille_de_la_memoire_en_octets));
                                                      EGAL(taille_de_la_memoire_en_octets,AINT(taille_de_la_memoire_en_octets));
                                                      CAL1(Prer1("%d qui sera utilise)\n",INTE(taille_de_la_memoire_en_octets)));
                                                      Eblock
                                                 ATes
                                                      Bblock
                                                      Eblock
                                                 ETes
                                                 Eblock
                                                 )
                                            );
                                        /* Le 20120131181218 'PROCESS_ARGUMENT_F(...)' a remplace 'GET_ARGUMENT_F(...)' afin de      */
                                        /* permettre de valider 'taille_de_la_memoire_en_octets'...                                  */
                         )
                    );

     EGAL(taille_testable_de_la_memoire_en_octets,ABSO(INTE(taille_de_la_memoire_en_octets)));

     Test(IZLE(taille_testable_de_la_memoire_en_octets))
          Bblock
          EGAL(taille_testable_de_la_memoire_en_octets,INFINI);
                                        /* Le forcage de l'INFINI a ete introduit le 20090320175955 a cause du nombre -2147483648    */
                                        /* qui est son propre inverse :                                                              */
                                        /*                                                                                           */
                                        /*                  -(-2147483648) = -2147483648                                             */
                                        /*                                                                                           */
                                        /* car, en effet, il vaut '0x80000000' dont le complement a 2 est aussi '0x80000000'...      */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IFNE(FLOT(taille_testable_de_la_memoire_en_octets),taille_de_la_memoire_en_octets))
                                        /* Test introduit le 20090319083808...                                                       */
          Bblock
          PRINT_ERREUR("la taille de la memoire declaree est trop grande, seule une partie sera testee");
          CAL1(Prer2("(taille de la memoire en octets = %f (%f))\n"
                    ,taille_de_la_memoire_en_octets
                    ,FLOT(taille_testable_de_la_memoire_en_octets)
                     )
               );
          CAL1(Prer1("(taille de la memoire testee = %d)\n",taille_testable_de_la_memoire_en_octets));
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     EGAL(taille_testable_de_la_memoire_en_octets,MULD(taille_testable_de_la_memoire_en_octets,NOCMO));

     begin_nouveau_block
          Bblock
          DEFV(Int,DdTb1(POINTERi
                        ,memoire
                        ,TAILLE_DE_LA_MEMOIRE_EN_Int
                        ,iMalo(taille_testable_de_la_memoire_en_octets)
                         )
               );
                                        /* Allocation du vecteur destine a la memoire a tester.                                      */

          Repe(nombre_d_iterations)
               Bblock
               Test(IL_FAUT(tester_de_facon_incrementale))
                    Bblock
                    TEST_D_UNE_PATTERN(NEUT(compteur_des_repetitions_du_Repe));
                    TEST_D_UNE_PATTERN(SOUS(TAILLE_DE_LA_MEMOIRE_EN_Int,compteur_des_repetitions_du_Repe));
                                        /* Les tests de nature incrementale furent introduits le 20051210104215. Il s'agit donc      */
                                        /* alors de tester avec une valeur variable et non pas une "pattern" fixee a la meme valeur  */
                                        /* pour tous les mots de la memoire...                                                       */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IL_FAUT(tester_avec_des_patterns))
                    Bblock
                    TEST_D_UNE_PATTERN(pattern_1);
                    TEST_D_UNE_PATTERN(pattern_2);
                    TEST_D_UNE_PATTERN(pattern_3);
                    TEST_D_UNE_PATTERN(pattern_4);
                                        /* Test des differentes "patterns". On notera le 20031112140306 le probleme de '$LACT15'     */
                                        /* pour une seule iteration (iterations=1) :                                                 */
                                        /*                                                                                           */
                                        /*                  taille=904000000  : 7.350u 2.110s 0:10.60 89.2% 0+0k 0+0io 268pf+0w      */
                                        /*                  taille=905000000  : le programme n'a toujours pas rendu la main au       */
                                        /*                                      bout d'une heure...                                  */
                                        /*                                                                                           */
                                        /* la taille de la memoire physique etant de 878000000. On notera que le phenomene decrit    */
                                        /* precedemment se produit aussi si la zone 'memoire' est allouee de facon statique a        */
                                        /* l'aide d'un tableau 'memoire[taille]' ('v $xtc/CheckMem$vv$c'), de meme qu'en utilisant   */
                                        /* un autre langage de programmation ('v $xtf/trashing.01$f'). Enfin, ce probleme se         */
                                        /* rencontre sur toutes les MACHINEs de type 'SYSTEME_APC_Linux'...                          */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ERep

          FdTb1(memoire,TAILLE_DE_LA_MEMOIRE_EN_Int,Int,ADRESSE_PLUS_DEFINIE);
                                        /* Liberation du vecteur contenant la memoire a tester.                                      */
                                        /*                                                                                           */
                                        /* Le 'ADRESSE_PLUS_DEFINIE' a ete introduit le 20050221170714...                            */
          Eblock
     end_nouveau_block

     RETU_Commande;
     Eblock
ECommande



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.