CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

printf("blabla");

godrik
godrik
Niveau 30
24 décembre 2011 à 18:54:19

Tu n'as jamais access explicitement au cache, le cache est entierement controlle par les access que tu fais a la memoire.

On peut aussi demander au cache de precacher une partie des donnes de facon a eviter des defaut de cache successif, mais la masse de donnnees transferer depuis la memeoire vers le cache reste la meme. (soit avec des instructions zarbi du processeur, ou en accedeant de la memoire "pour rien" ou encore, en utilisant un thread auxiliaire.)

Souvent, on cherche a ameliorer la localite des access a la memoire ou a reduire le montant de memoire utiliser.

Passer de int a short permet de couper l'allocation memoire en deux exemple. Si tu n'as pas besoin de valeur superieur a 65K, tu viens de permettre a ton tableau de rentrer en cache. Si tu as une structure de donne qui fait 3 octets, il y a fort a parier que ton compilateur/langage aligne sur 4 octets et "gaspille" 1/4 de la memoire, retirer l'alignement manuellement permet de gagner significativement des performances. Tu peux aussi voir pour compresser tes donnees. Il y a plein de cas, ou tu peux representer tes donnees dans une autre forme plus compacte et qui va permettre de rentrer en cache.

L'autre technique est de changer comment on accede au donnees en reecrivant l'algo. Un exemple classique est le floutage d'une image qui typiquement s'ecrit comme ca:

for (int i=0; i<N; i++) for (int j=0; j<M; j++) new[i][j] =
old[i][j]+old[i-1][j]+old[i+1][j]+old[i][j-1]+old[
i][j+1];
(oui, je sais, les access au bord tout ca...)

Regarde visuellement comment tu accedes a la memoire dans un cas comme ca. les lignes de l'image sont acceder par groupe de 3. quand tu traites la ligne 5, tu accedes a la ligne 4 et 6. Quand tu vas traiter la ligne 6, tu accedera a la ligne 5 et 7. Si ton image est tres grande, quand tu traite la ligne 6, la ligne 5 n'est deja plus en cache (parceque M est tres grand). Du coup, tu te retrouve a charger cache ligne de old 3 fois. A la place, tu peux decouper ton image en bloc de taille calcule pour que ca tienne en cache. Et traiter l'image par bloc. Ainsi l'image n'est charge qu'une seule fois en memoire. Pour plus d'information, regarde la notion de Z-order et comment ecrire le produit de matrice par matrice (dense).

Paulop
Paulop
Niveau 12
24 décembre 2011 à 19:34:07

Donc le meilleur moyen c'est de découper nos données pour les faire rentrer dans le cache et d'itérer sur ces blocs plutôt que sur la donnée entière.
Du coup si on sait que ça va dépasser 4MB par exemple, on se débrouille pour découper ça en bloc de 4MB et puis de les traiter un à un.

En tout cas merci pour la réponse, et bonne fête de Noël à tous le monde :)

godrik
godrik
Niveau 30
24 décembre 2011 à 19:55:08

c'est l'idee.

Eviter les structures creuse ou les structures a base de pointeur. Quand on a pas le choix, preallouer les zones de memoire dans un ou plusieurs pool de memoire continue. Ce genre de truc.

Note que le systeme d'exploitation peut t'indiquer pas mal de statistique sur l'utilisation des caches par un processus.

Sous linux (kernel > 2.6.31), on trouve l'outil "perf stat" qui rapporte des statistiques utiles. On peut avoir grosso modo, des estimations par ligne de code avec "perf record" et "perf annotate". On peut avoir une estimation plus precise avec cachegrind, mais c'est un environement simule qui a d'autres probleme de precision.

godrik
godrik
Niveau 30
24 décembre 2011 à 19:55:28

PS: et joyeux noel a tout le monde. :)

caelacanthe
caelacanthe
Niveau 10
24 décembre 2011 à 19:57:40

joyeux noel. :oui:

Bunyan
Bunyan
Niveau 17
26 décembre 2011 à 09:34:33

Joyeux Noël à tous :)

Paulop
Paulop
Niveau 12
26 décembre 2011 à 18:34:24

http://webcache.googleusercontent.com/search?q=cache%3aJa9dLgwsmWQJ%3ajobs.gamasutra.com/jobseekerx/viewjobrss.asp%3Fcjid%3D22685%26accountno%3D358+suckerpunch.com+create+a+queue&amp;cd=1&amp;hl=en&amp;ct=clnk&amp;gl=us

Sympa le test avant de postuler à Sucker Punch Productions à l'époque.
L'idée est de recréer une pile FIFO sans utiliser malloc.

Dans l'idée Q serait juste une struct avec un tableau de char de 2048 et un compteur.
Par contre aucune idée de la solution la plus rapide pour décaler tous les byte dans le tableau quand on push ou pop.
J'imagine que simplement les décaler d'une case n'est pas la méthode la plus véloce quand la pile est presque pleine. :/

Paulop
Paulop
Niveau 12
26 décembre 2011 à 18:51:10

Je viens de dire une bétise, il semble qu'on utilise le même pool de mémoire de 2048 bytes pour toutes les queues. Mais par contre, sans utiliser malloc, comment on peut retourner un pointeur Q à partir de create ? :(

Paulop
Paulop
Niveau 12
26 décembre 2011 à 19:04:27

Ah ok on sait qu'il y a au max 64 queues ça nous permet de travailler sur un pool de type Q préalloués.

Paulop
Paulop
Niveau 12
27 décembre 2011 à 02:44:11

La solution vers laquelle je me dirige :

Je vais découper les datas en block de 16 ou 32 bytes. 15/31 bytes de données et un byte qui permet de récupérer l'index du next block.

Puis dans Data[2048]
Le byte 0 servira de "freelist" et contiendra l'adresse du prochain bloc libre.
De 1 à 64*sizeof(Q struct) : Nos handlers de queues
Puis ensuite on aura nos blocs.

Ma struct Q serait composé à priori de l'adresse de la queue et la tête et de l'offset de la donnée de tête dans la tête et la donnée de queue dans la queue. Un bit utilisé pour savoir si la queue est utilisée ou non.

J'ai pas fait les calculs pour savoir combien de bits il me faut pour stocker les index de chaque bloc en fonction de la taille des blocs, et pour arriver à en avoir assez pour arriver au cas moyen de 15 queue 80 bytes. Je verrai demain. Ca va jouer serrer entre des blocs de 16 et 32 bytes et des index sur 6 ou 7 bits à mon avis ^^

J'essayerai d'implémenter demain ou prochainement.

Paulop
Paulop
Niveau 12
27 décembre 2011 à 02:48:54

Par contre j'ai mit bien plus d'une heure à trouver une bonne méthode en cherchant bien sur le net. Il me faut encore m'exercer (mais bon c'est pour un post de senior à l'origine alors ça me rassure un minimum ^^)

kufa
kufa
Niveau 9
27 décembre 2011 à 22:15:08

Oublie pas d'aligner ton Data[].

Paulop
Paulop
Niveau 12
27 décembre 2011 à 23:05:35

Un tableau alloué statiquement n'est pas forcément aligné en mémoire ?

041
041
Niveau 10
28 décembre 2011 à 17:19:07

J'avais fini, et puis j'ai remarqué que c'était toutes les listes qui se partageaient le tableau de 2048, et pas un tableau de 2048 pour chaque :fou:

C'est déjà plus compliqué :hap:

041
041
Niveau 10
28 décembre 2011 à 17:19:53

Enfin, j'ai ça moi:
http://pastebin.com/yMgqa662

Je ferai le 2048 une autre fois :oui:

Paulop
Paulop
Niveau 12
28 décembre 2011 à 17:32:36

Héhé, t'inquiête pas, j'ai aussi eu du mal à déchiffrer, mais à priori c'est bien un pool de 2048 partagé pour stocker toutes les variables. Donc y compris les structures de données qui représentent les queues.

kufa
kufa
Niveau 9
29 décembre 2011 à 00:31:55

@paulop: si c'est aligne, mais pas forcement aligne sur une cache line

Paulop
Paulop
Niveau 12
29 décembre 2011 à 00:43:46

Effectivement, c'est pour ça que j'essaye d'avoir des blocs les plus larges possible, histoire d'éviter de trop mélanger les données. Mais bon je pense que 32 bytes ça va être juste, le plus optimal semble être 16, pour des cache line qui sont en général de 64 bytes. Mais bon c'est plus pour l'exercice, après il faut s'adapter à la plateforme.

Puis faut que je trouve du temps pour faire ça au calme pendant 1h.

caelacanthe
caelacanthe
Niveau 10
22 janvier 2012 à 16:08:33

dites, je suis bientôt unemployed. :hap:

il y a des sites qui répertorient des annonces pour travailler dans l'informatique, côté programmation? :peur:

Pocolo
Pocolo
Niveau 10
22 janvier 2012 à 16:13:51

http://www.gamasutra.com/jobs/

Tu as celui-là pour les jobs dans des boites de jv aux US. :hap:

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment