Forum Linux.général [requete]Test de mémoire sur une machine 64 bits

Posté par  (site web personnel) .
Étiquettes : aucune
0
15
nov.
2006
Bonjour, afin de de terminer le garbage collector de Lisaac, on aurait besoin de connaitre les alignement mémoire standard que l'on trouve sur une machine 64 bit. La machine doit être sous linux, compilé en 64 bits, avec un GCC tout autant 64 bits.

On aurait besoin des résultats renvoyés sur la sortie standard du programme suivant :

#include <stdio.h>

// On déclare différent type de variable

void aff(unsigned int adr, int sz)
{
printf("Pointeur %02d bits : %x -> %x align 32:",sz*8,adr,adr + sz -1);
if ((adr & 3)==0) printf("Yes"); else printf("No ");
printf(" align 64:");
if ((adr & 7)==0) printf("Yes"); else printf("No ");
printf("\n");
};

int main(void)
{
int t1;
short t2;
long t3;
long long t4;
char t5;

aff((unsigned long)&t1,sizeof(int));
aff((unsigned long)&t2,sizeof(short));
aff((unsigned long)&t3,sizeof(long));
aff((unsigned long)&t4,sizeof(long long));
aff((unsigned long)&t5,sizeof(char));
return 0;
};


Merci !
  • # Sortie standard

    Posté par  (site web personnel) . Évalué à -3.

    Le programme indiqué ci dessus envoit ses résultats sur la sortie standard.
    Voila, c'est ce que tu avais demandé, content de t'avoir aidé.
  • # resultats processeurs serveurs

    Posté par  (site web personnel) . Évalué à 3.

    Intel Woodcrest:

    Pointeur 32 bits : 527b80dc -> 527b80df align 32:Yes align 64:No
    Pointeur 16 bits : 527b80da -> 527b80db align 32:No align 64:No
    Pointeur 64 bits : 527b80d0 -> 527b80d7 align 32:Yes align 64:Yes
    Pointeur 64 bits : 527b80c8 -> 527b80cf align 32:Yes align 64:Yes
    Pointeur 08 bits : 527b80c7 -> 527b80c7 align 32:No align 64:No

    AMD Opteron:

    Pointeur 32 bits : ff81390c -> ff81390f align 32:Yes align 64:No
    Pointeur 16 bits : ff81390a -> ff81390b align 32:No align 64:No
    Pointeur 64 bits : ff813900 -> ff813907 align 32:Yes align 64:Yes
    Pointeur 64 bits : ff8138f8 -> ff8138ff align 32:Yes align 64:Yes
    Pointeur 08 bits : ff8138f7 -> ff8138f7 align 32:No align 64:No

    j'ai pas de processeurs 64bits classe desktop (athlon/core2) ni d'itanium
    donc je peut pas faire plus ;)

    voili voilou
    • [^] # Re: resultats processeurs

      Posté par  . Évalué à 1.

      Processeurs AMD Athlon64 compatible 32bits
      Ubuntu Linux 6.10 version AMD64


      neox@amd64l:~/Desktop$ cat /proc/cpuinfo
      processor : 0
      vendor_id : AuthenticAMD
      cpu family : 15
      model : 15
      model name : AMD Athlon(tm) 64 Processor 3500+
      stepping : 0
      cpu MHz : 2211.375
      cache size : 512 KB
      fpu : yes
      fpu_exception : yes
      cpuid level : 1
      wp : yes
      flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext lm 3dnowext 3dnow up
      bogomips : 4425.35
      TLB size : 1024 4K pages
      clflush size : 64
      cache_alignment : 64
      address sizes : 40 bits physical, 48 bits virtual
      power management: ts fid vid ttp

      neox@amd64l:~/Desktop$ gcc --version
      gcc (GCC) 4.1.2 20060928 (prerelease) (Ubuntu 4.1.1-13ubuntu5)
      Copyright (C) 2006 Free Software Foundation, Inc.
      This is free software; see the source for copying conditions. There is NO
      warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

      neox@amd64l:~/Desktop$ ./a.out
      Pointeur 32 bits : 93ba1278 -> 93ba127b align 32:Yes align 64:Yes
      Pointeur 16 bits : 93ba127c -> 93ba127d align 32:Yes align 64:No
      Pointeur 64 bits : 93ba1270 -> 93ba1277 align 32:Yes align 64:Yes
      Pointeur 64 bits : 93ba1268 -> 93ba126f align 32:Yes align 64:Yes
      Pointeur 08 bits : 93ba127f -> 93ba127f align 32:No align 64:No

  • # C'est pourtant simple...

    Posté par  . Évalué à 3.

    Sur un système 64 bits, il y a plusieurs choix possible pour les tailles des types int, long et des pointeurs.

    Le plus fréquemment recontré (et considéré comme le plus viable) est le modèle I32LP64, dans lequel un int fait 32 bits, et un long comme un pointeur font 64 bits. C'est le modèle utilisé par à peu près tous les Un*x sur 64 bits (dont Linux).

    On a donc :
    sizeof(int) = 4, aligné sur 4 octets
    sizeof(long) = 8, aligné sur 8 octets.

    La définition du type long long est plus "aléatoire" et pourra varier d'un système à l'autre ou d'une plate-forme à l'autre. En général on définit long long comme long, donc 8 octets.

    De toute façon pour du code portable, on s'en fiche un peu. On sait que l'on a sizeof(int) <= sizeof(long) <= sizeof(long long), et que comme peu d'architectures apprécient les accès non alignés, qu'une variable de type long est forcément alignée à une adresse multiple de sizeof(long). Pas la peine de se coltiner des #define ou des valeurs magiques.
    • [^] # Re: C'est pourtant simple...

      Posté par  . Évalué à 1.

      De toute façon pour du code portable, on s'en fiche un peu.

      J'approuve.
      On sait que l'on a sizeof(int) <= sizeof(long) <= sizeof(long long),

      Faux. On a "rangeof(int) <= rangeof(long) <= rangeof(long long)"rangeof désigne le domaine de valeurs couverts par le type (et même "rangeof(char) <= rangeof(short) <= rangeof(int)").
      Vicisieusement, la norme C ne spécifie rien sur les tailles des types entiers, si ce n'est que sizeof(char) == 1, et que sizeof(T) doit toujours renvoyer une valeur de type size_t (donc des valeurs entières, et pas 0,5 ou 2,75 par exemple).

      Bon, après, en pratique, il ne doit y avoir qu'une DS9k pour avoir sizeof(int) > sizeof(long). Mais elle en a le droit, merci les bits de bourrage ;)

      et que comme peu d'architectures apprécient les accès non alignés, qu'une variable de type long est forcément alignée à une adresse multiple de sizeof(long). Pas la peine de se coltiner des #define ou des valeurs magiques.

      Idem aussi. Tant qu'on s'amuse avec les pointeurs et sizeof dans les limites de la norme, on s'en fiche de savoir si long est aligné sur 4 ou 8 octets...
  • # Remarques

    Posté par  . Évalué à 1.

    void aff(unsigned int adr, int sz)
    /* .... */
    int main(void)
    {
    int t1;
    short t2;
    long t3;
    long long t4;
    char t5;

    aff((unsigned long)&t1,sizeof(int));
    aff((unsigned long)&t2,sizeof(short));
    aff((unsigned long)&t3,sizeof(long));
    aff((unsigned long)&t4,sizeof(long long));
    aff((unsigned long)&t5,sizeof(char));
    return 0;
    };

    Un cast d'un pointeur vers un type unsigned long n'est pas garanti par la norme, il peut y avoir des pertes. Par contre, le type uintptr_t (si je ne m'abuse, vérifie dans la norme) est fait pour convertir sans perte (ou avec le minimum de perte ?) une valeur entre les type pointeur et entier.

    De plus, tu castes en unsigned long, alors que ta fonction attend un unsigned int...?

    Par ailleurs, sizeof renvoie un size_t, et je ne croie pas que ce type ait forcément un domaine de valeurs inclut dans celui de int. Il pourraît être plus grand, si par exemple int fait 32 bits et qu'on peut allouer des objets dont la taille est plus grosse que 2^32 bits.

    Ok, tu n'as montré ici qu'un code "juste pour tester", pas l'appli complète. Mais en te faisant les remarques ici, ça pourra peut-être éviter que les mêmes choses arrivent dans l'appli...

    Pour compléter mon post juste au-dessus, je ne dis pas que connaître l'adressage et alignement mémoire n'est pas nécessaire dans ton cas, mais juste que, si tu peux arriver à coder ce que tu veux sans avoir à faire ce genre de tests, c'est plus sûr (et plus portable). Mais tu dois déjà être au courant...
  • # L'affaire est dans Lisaac.

    Posté par  (site web personnel) . Évalué à 2.

    ~ $ cat /proc/cpuinfo
    processor : 0
    vendor_id : AuthenticAMD
    cpu family : 15
    model : 35
    model name : AMD Athlon(tm) 64 X2 Dual Core Processor 4400+
    stepping : 2
    cpu MHz : 1000.000
    cache size : 1024 KB
    physical id : 0
    siblings : 2
    core id : 0
    cpu cores : 2
    fpu : yes
    fpu_exception : yes
    cpuid level : 1
    wp : yes
    flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt lm 3dnowext 3dnow pni lahf_lm cmp_legacy
    bogomips : 2010.10
    TLB size : 1024 4K pages
    clflush size : 64
    cache_alignment : 64
    address sizes : 40 bits physical, 48 bits virtual
    power management: ts fid vid ttp

    processor : 1
    vendor_id : AuthenticAMD
    cpu family : 15
    model : 35
    model name : AMD Athlon(tm) 64 X2 Dual Core Processor 4400+
    stepping : 2
    cpu MHz : 1000.000
    cache size : 1024 KB
    physical id : 0
    siblings : 2
    core id : 1
    cpu cores : 2
    fpu : yes
    fpu_exception : yes
    cpuid level : 1
    wp : yes
    flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt lm 3dnowext 3dnow pni lahf_lm cmp_legacy
    bogomips : 2010.10
    TLB size : 1024 4K pages
    clflush size : 64
    cache_alignment : 64
    address sizes : 40 bits physical, 48 bits virtual
    power management: ts fid vid ttp

    ~ $ gcc --version
    gcc (GCC) 4.1.1 (Gentoo 4.1.1)
    Copyright © 2006 Free Software Foundation, Inc.
    Ce logiciel est libre; voir les sources pour les conditions de copie. Il n'y a PAS
    GARANTIE; ni implicite pour le MARCHANDAGE ou pour un BUT PARTICULIER.

    ~ $ uname -a
    Linux 2.6.18-gentoo-r1 #1 SMP PREEMPT Tue Oct 17 20:29:54 CEST 2006 x86_64 AMD Athlon(tm) 64 X2 Dual Core Processor 4400+ AuthenticAMD GNU/Linux

    ~ $ ./a.out
    Pointeur 32 bits : 5c4fd51c -> 5c4fd51f align 32:Yes align 64:No
    Pointeur 16 bits : 5c4fd51a -> 5c4fd51b align 32:No align 64:No
    Pointeur 64 bits : 5c4fd510 -> 5c4fd517 align 32:Yes align 64:Yes
    Pointeur 64 bits : 5c4fd508 -> 5c4fd50f align 32:Yes align 64:Yes
    Pointeur 08 bits : 5c4fd507 -> 5c4fd507 align 32:No align 64:No

    Note au passage :
    CFLAGS/CXXFLAGS -march=k8 -O2 -pipe -fomit-frame-pointer
    CHOST x86_64-pc-linux-gnu
  • # IBM RS6000 / Power3

    Posté par  (site web personnel) . Évalué à 2.

    # cat /proc/cpuinfo
    processor : 0
    cpu : POWER3 (630+)
    clock : 375.000000MHz
    revision : 1.4 (pvr 0041 0104)

    processor : 1
    cpu : POWER3 (630+)
    clock : 375.000000MHz
    revision : 1.4 (pvr 0041 0104)

    processor : 2
    cpu : POWER3 (630+)
    clock : 375.000000MHz
    revision : 1.4 (pvr 0041 0104)

    processor : 3
    cpu : POWER3 (630+)
    clock : 375.000000MHz
    revision : 1.4 (pvr 0041 0104)

    timebase : 93748329
    platform : pSeries
    machine : CHRP IBM,7044-270

    # gcc --version
    gcc (GCC) 4.1.2 20061028 (prerelease) (Debian 4.1.1-19)
    Copyright (C) 2006 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions. There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    # ./memalign
    Pointeur 32 bits : ffd67a58 -> ffd67a5b align 32:Yes align 64:Yes
    Pointeur 16 bits : ffd67a5c -> ffd67a5d align 32:Yes align 64:No
    Pointeur 32 bits : ffd67a60 -> ffd67a63 align 32:Yes align 64:Yes
    Pointeur 64 bits : ffd67a68 -> ffd67a6f align 32:Yes align 64:Yes
    Pointeur 08 bits : ffd67a70 -> ffd67a70 align 32:Yes align 64:Yes
  • # HP DL385 / Bi Opteron 370

    Posté par  (site web personnel) . Évalué à 2.

    # cat /proc/cpuinfo
    processor : 0
    vendor_id : AuthenticAMD
    cpu family : 15
    model : 33
    model name : AMD Opteron(tm) Processor 270
    stepping : 2
    cpu MHz : 2000.000
    cache size : 1024 KB
    physical id : 0
    siblings : 2
    core id : 0
    cpu cores : 2
    fpu : yes
    fpu_exception : yes
    cpuid level : 1
    wp : yes
    flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt lm 3dnowext 3dnow pni cmp_legacy
    bogomips : 4009.39
    TLB size : 1024 4K pages
    clflush size : 64
    cache_alignment : 64
    address sizes : 40 bits physical, 48 bits virtual
    power management: ts fid vid ttp

    [x4]

    # gcc --version
    gcc (GCC) 4.1.1 20060525 (Red Hat 4.1.1-1)
    Copyright © 2006 Free Software Foundation, Inc.
    Ce logiciel est libre; voir les sources pour les conditions de copie. Il n'y a PAS
    GARANTIE; ni implicite pour le MARCHANDAGE ou pour un BUT PARTICULIER.

    # ./memalign
    Pointeur 32 bits : 453a388c -> 453a388f align 32:Yes align 64:No
    Pointeur 16 bits : 453a388a -> 453a388b align 32:No align 64:No
    Pointeur 64 bits : 453a3880 -> 453a3887 align 32:Yes align 64:Yes
    Pointeur 64 bits : 453a3878 -> 453a387f align 32:Yes align 64:Yes
    Pointeur 08 bits : 453a3877 -> 453a3877 align 32:No align 64:No

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.