Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2927 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

question sur les multi core et c++

n°1601034
Taz
bisounours-codeur
Posté le 20-08-2007 à 11:54:31  profilanswer
 

Reprise du message précédent :

MagicBuzz a écrit :


ben ça doit être gai...*
 
pis alors le coup du read synchrone mais pas le write, c'est trop fort...
donc j'ai le droit de travailler pendant que le prog écrit, mais pas pendant qu'il lit ? si ça c'est pas du mongolisme primaire...
 
si y'a pourtant bien un truc qui devrait être assynchrone, c'est bien la lecture, rien ne m'empêche de commencer à traîter ce qui est déjà lu pendant que je continue de charger mon fichier...
 
 
* : donc vous confirmer que si j'écris sur le disque le contenu mémoire situé à une adresse (un byte[] passé par référence par exemple), et qu'un fois écrit je commence à modifier ce dernier (genre le détruire puisqu'il ne me sert plus à rien), alors je vais écrire n'importe quoi dans mon fichier ?
 
que windows gère son propre cache logiciel, et diffère les écritures, je veux bien. mais quand j'écris 2 Go d'un coup dans un fichier, ça me ferait bien mal que la milliseconde suivant l'appel j'aie de nouveau la main dans mon programme :heink:


genre style t'as un truc entre ton programme et ton disque dur qui s'appelle un quernail. Quand tu fais un appel système genre write, il copie le buffer de données, lance le travail, et te rends la main. Inutile de bloquer un programme sur un write tant que les buffer de destination de sont pas plein (genre pipe, socket où ça va se produire rapidement).
 
Bah donc tu vas avoir mal : ça prendra un peu plus que quelques millisecondes, mais si t'as suffisemment de RAM, et bien ça ira vite.
 
C'est tellement asynchrone que dans toutes tes API, tu vas trouver des méthodes sync/fsync ...

mood
Publicité
Posté le 20-08-2007 à 11:54:31  profilanswer
 

n°1601043
MagicBuzz
Posté le 20-08-2007 à 12:04:05  profilanswer
 

et les buffers logiques du kernel sont pas limités en taille ?
 
franchement, autant pour des blocs de quelques ko, effectivement, le fait que le kernel gère un cache permet effectivement de rendre instantanés les appels aux écritures, autant pour plusieurs mo, j'ai du mal à concevoir comment l'os va pouvoir te rendre la main aussi tôt sans te saturer la mémoire... et pour moi, les caches disques sont plutôt limités en taille.
 
dans tous les cas, lorsque j'avais fait ma fonction d'encryption, et que je la lançais sur de très gros volums (genre un VOB), le faire de faire tourner l'écriture dans un thread séparé me permettait d'aller énormément plus vite.
bon, la lecture aussi était dans un thread, ça pouvait éventuellement venir de là aussi.
 
dans ce cas, on va donc changer mon exemple en parlant non plus de l'enregistrement du graph sur le disque, mais l'inverse : pendant que je lis sur le disque le bloc suivant (thread fournisseur), je peux m'occuper dans un thread séparé (consomateur) de désérialiser les données déjà lues afin de les charger en mémoire sous forme d'arbre. à ce moment le gain sera énorme, pour peu que les accès disques ne bouffent que peu de CPU (donc sur un disque ATAPI, le gain est de 0 par exemple, puisque les accès disques prennent 100% du CPU)

Message cité 3 fois
Message édité par MagicBuzz le 20-08-2007 à 12:06:31
n°1601067
Taz
bisounours-codeur
Posté le 20-08-2007 à 13:20:25  profilanswer
 

MagicBuzz a écrit :

et les buffers logiques du kernel sont pas limités en taille ?
 
franchement, autant pour des blocs de quelques ko, effectivement, le fait que le kernel gère un cache permet effectivement de rendre instantanés les appels aux écritures, autant pour plusieurs mo, j'ai du mal à concevoir comment l'os va pouvoir te rendre la main aussi tôt sans te saturer la mémoire... et pour moi, les caches disques sont plutôt limités en taille.
 
dans tous les cas, lorsque j'avais fait ma fonction d'encryption, et que je la lançais sur de très gros volums (genre un VOB), le faire de faire tourner l'écriture dans un thread séparé me permettait d'aller énormément plus vite.
bon, la lecture aussi était dans un thread, ça pouvait éventuellement venir de là aussi.
 
dans ce cas, on va donc changer mon exemple en parlant non plus de l'enregistrement du graph sur le disque, mais l'inverse : pendant que je lis sur le disque le bloc suivant (thread fournisseur), je peux m'occuper dans un thread séparé (consomateur) de désérialiser les données déjà lues afin de les charger en mémoire sous forme d'arbre. à ce moment le gain sera énorme, pour peu que les accès disques ne bouffent que peu de CPU (donc sur un disque ATAPI, le gain est de 0 par exemple, puisque les accès disques prennent 100% du CPU)


Tu penses comme un windowsien : t'as payé cher ta RAM, tu devrais être content si ton OS est capable de la garder en permanence pleine à 100% pour accélérer les E/S. T'as du mal à concevoir, mais pourtant c'est la réalité. Là sur un serveur, je mets 2s pour écrire 1giga, sois 500Mo/s. Le serveur à 3ans, un pauvre disque SCSI, mais 4G de RAM. Par contre un write+sync, il me faut 33s, et donc un débit genre 30Mo/s.
 
Dans ton cas, je comprends pas trop, il n'y a d'intérêt à threader que pour séparer lecture et moulinage. Le rôle de l'écriture comme facteur limitant devrait quand même être moindre pour un truc qui bouffe du CPU. Après, suivant ton OS plus ou moins mité, il ce peut que tu aies un scheduler d'E/S foireux. Genre sous XP, quand tu bourrines en lecteur+écriture, ça fait toujours plaisir d'entendre les têtes lecture faire le grand écart à un rhythme soutenu. Avec des perfs qui s'effondrent bien sur.

n°1601068
Taz
bisounours-codeur
Posté le 20-08-2007 à 13:21:14  profilanswer
 

MagicBuzz a écrit :

dans ce cas, on va donc changer mon exemple en parlant non plus de l'enregistrement du graph sur le disque, mais l'inverse : pendant que je lis sur le disque le bloc suivant (thread fournisseur), je peux m'occuper dans un thread séparé (consomateur) de désérialiser les données déjà lues afin de les charger en mémoire sous forme d'arbre. à ce moment le gain sera énorme, pour peu que les accès disques ne bouffent que peu de CPU (donc sur un disque ATAPI, le gain est de 0 par exemple, puisque les accès disques prennent 100% du CPU)

tiens j'ai pas entendu ce terme d'ATAPI depuis qu'on a gagné la coupe du monde

n°1601071
MagicBuzz
Posté le 20-08-2007 à 13:35:30  profilanswer
 

bon, ok, donc on reprend l'exemple mais pour la lecture et il devient valide :o

n°1601111
bjone
Insert booze to continue
Posté le 20-08-2007 à 14:55:21  profilanswer
 

MagicBuzz a écrit :


ben ça doit être gai...*
 
pis alors le coup du read synchrone mais pas le write, c'est trop fort...
donc j'ai le droit de travailler pendant que le prog écrit, mais pas pendant qu'il lit ? si ça c'est pas du mongolisme primaire...
 
si y'a pourtant bien un truc qui devrait être assynchrone, c'est bien la lecture, rien ne m'empêche de commencer à traîter ce qui est déjà lu pendant que je continue de charger mon fichier...
 
 
* : donc vous confirmer que si j'écris sur le disque le contenu mémoire situé à une adresse (un byte[] passé par référence par exemple), et qu'un fois écrit je commence à modifier ce dernier (genre le détruire puisqu'il ne me sert plus à rien), alors je vais écrire n'importe quoi dans mon fichier ?
 
que windows gère son propre cache logiciel, et diffère les écritures, je veux bien. mais quand j'écris 2 Go d'un coup dans un fichier, ça me ferait bien mal que la milliseconde suivant l'appel j'aie de nouveau la main dans mon programme :heink:


 
 :pt1cable:  
 
si tu as plus de 2Go de mémoire oui, tu as la main un peu après.

n°1601123
bjone
Insert booze to continue
Posté le 20-08-2007 à 15:01:55  profilanswer
 

MagicBuzz a écrit :

et les buffers logiques du kernel sont pas limités en taille ?
 
franchement, autant pour des blocs de quelques ko, effectivement, le fait que le kernel gère un cache permet effectivement de rendre instantanés les appels aux écritures, autant pour plusieurs mo, j'ai du mal à concevoir comment l'os va pouvoir te rendre la main aussi tôt sans te saturer la mémoire... et pour moi, les caches disques sont plutôt limités en taille.
 
dans tous les cas, lorsque j'avais fait ma fonction d'encryption, et que je la lançais sur de très gros volums (genre un VOB), le faire de faire tourner l'écriture dans un thread séparé me permettait d'aller énormément plus vite.
bon, la lecture aussi était dans un thread, ça pouvait éventuellement venir de là aussi.
 
dans ce cas, on va donc changer mon exemple en parlant non plus de l'enregistrement du graph sur le disque, mais l'inverse : pendant que je lis sur le disque le bloc suivant (thread fournisseur), je peux m'occuper dans un thread séparé (consomateur) de désérialiser les données déjà lues afin de les charger en mémoire sous forme d'arbre. à ce moment le gain sera énorme, pour peu que les accès disques ne bouffent que peu de CPU (donc sur un disque ATAPI, le gain est de 0 par exemple, puisque les accès disques prennent 100% du CPU)


 
1) l'ATAPI est une norme pour les lecteurs optiques il me semble
2) les transferts qui prennent 100% du cpu c'est via le mode PIO, et ça n'exsite plus depuis 1995 (genre y'a un truc ça s'appelle UDMA, et dans UDMA y'a DMA).
3) je vois plus le rapport avec la choucroute.

n°1601137
MagicBuzz
Posté le 20-08-2007 à 15:06:04  profilanswer
 

1-2 / Ah ouais, chavais bien que ct pas le bon terme. Donc ATAPI et PIO sont dans un bateau. Bjone passe par là. Qui reste sur le bateau ? [:magicbuzz]
3/ ct juste pour dire que ct le seul cas possible où l'utilisation de threads n'apportait rien (parcequ'il y en a toujours un qui va venir me dire "mais oui mais nan en fait quand c'est comme ça t'as tord" juste pour le plaisir de faire chier :o


Message édité par MagicBuzz le 20-08-2007 à 15:06:19
n°1601140
christophe​_d13
L'efficacité à tout prix.
Posté le 20-08-2007 à 15:07:44  profilanswer
 

Je relance le débat, mais je confirme un peu tout ce qui est dit :
J'ai un programme qui s'occupe de réunir des fichiers au sein d'un seul.
Il est monothread et tourne de la même façon sous Windows XP 32 bits et 64 bits...
 
Voici son fonctionnement :
Il lit des milliers de fichiers et les compresse en mémoire jusqu'à atteindre 32Mo. Lorsque cette barrière est atteinte, le tampon est écrit et on recommence...
 
Ce que je peux dire, c'est qu'avec une taille de tampon d'écriture de 32Mo, c'est trés rapide... Mais on perd en vitesse si on réduit le tampon (et sans, c'est hyper lent).
 
Alors oui le Write-Back du Windows est présent et fonctionne assez bien, mais il n'est pas pilotable. Donc suivant l'application ou l'usage, il y a des désavantages.
 
Dans mon programme cité comme exemple, il y a lecture et écriture donc une belle polution du cache de Windows.
J'avais fait un portage en multi-thread de ce programme, mais cela n'a pas apporté grand chose au niveau des perfs : la compression est bien trop rapide face à la latence de lecture...
 
Mais j'ai également noté qu'il est plus rapide d'écrire par paquets (gros ou trés gros). Et cela sous Windows XP.
 
Quand à la config, au boulot j'ai un RAID5 hardware avec une promise EX16350 et à la maison c'est une TX4100.
 

Message cité 1 fois
Message édité par christophe_d13 le 20-08-2007 à 15:09:43

---------------
http://www.ikalizer.fr
n°1601151
red factio​n
Posté le 20-08-2007 à 15:19:14  profilanswer
 

bjone a écrit :


 
 :pt1cable:  
 
si tu as plus de 2Go de mémoire oui, tu as la main un peu après.


jviens de jeter un oeil a ta config, rassure moi tous ca c pas pour foutre sur un 17"

mood
Publicité
Posté le 20-08-2007 à 15:19:14  profilanswer
 

n°1601176
bjone
Insert booze to continue
Posté le 20-08-2007 à 15:33:42  profilanswer
 

non, ma machine perso est sur les deux 22" (CRT et LCD wide)
je réorganise ma description de conf :D

n°1601180
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 20-08-2007 à 15:36:04  profilanswer
 

ptain, une 8800 GTX [:mlc]

n°1601181
bjone
Insert booze to continue
Posté le 20-08-2007 à 15:38:02  profilanswer
 

Harkonnen a écrit :

ptain, une 8800 GTX [:mlc]


et encore, pas assez puissante :/

n°1601183
Taz
bisounours-codeur
Posté le 20-08-2007 à 15:41:19  profilanswer
 

christophe_d13 a écrit :

Je relance le débat, mais je confirme un peu tout ce qui est dit :
J'ai un programme qui s'occupe de réunir des fichiers au sein d'un seul.
Il est monothread et tourne de la même façon sous Windows XP 32 bits et 64 bits...
 
Voici son fonctionnement :
Il lit des milliers de fichiers et les compresse en mémoire jusqu'à atteindre 32Mo. Lorsque cette barrière est atteinte, le tampon est écrit et on recommence...
 
Ce que je peux dire, c'est qu'avec une taille de tampon d'écriture de 32Mo, c'est trés rapide... Mais on perd en vitesse si on réduit le tampon (et sans, c'est hyper lent).

Je sais pas si y ça sous windows, mais autant lancer une écriture asynchrone, c'est simple et efficace, pas la peine de faire un thread.

n°1601213
christophe​_d13
L'efficacité à tout prix.
Posté le 20-08-2007 à 16:04:38  profilanswer
 

Taz> J'ai pas trouver ce genre de fonction sous Windows. Je pense que c'est transparent de toute façon.


---------------
http://www.ikalizer.fr
n°1601222
Taz
bisounours-codeur
Posté le 20-08-2007 à 16:13:09  profilanswer
 

christophe_d13 a écrit :

Taz> J'ai pas trouver ce genre de fonction sous Windows. Je pense que c'est transparent de toute façon.


bah oui et non, non surtout sur des media lents/bloquants (pipe, socket, etc). avec une vraie API async, t'as surtout le moyen d'obtenir une notification en fin d'opération.

n°1601228
christophe​_d13
L'efficacité à tout prix.
Posté le 20-08-2007 à 16:19:19  profilanswer
 

Taz a écrit :

avec une vraie API async, t'as surtout le moyen d'obtenir une notification en fin d'opération.


C'est ce qui manque dans l'API de Windows.
 
J'y pense de plus en plus à développer ce genre de chose, surtout pour la lecture asynchrone.
C'est un sacré gain de temps.


---------------
http://www.ikalizer.fr
n°1601545
bjone
Insert booze to continue
Posté le 21-08-2007 à 09:10:43  profilanswer
 
n°1601564
christophe​_d13
L'efficacité à tout prix.
Posté le 21-08-2007 à 09:29:49  profilanswer
 

C'est vrai, je les avais oublié ces 2 là... Mais pour l'usage que j'en fait, cela ne me convient pas.
 


---------------
http://www.ikalizer.fr
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Petite question de DebutantQuestion sur le pid d'un script
[c] Question sur une boucle do...whileTri de réponses chiffre/caractère [resolu]
dev multi platormes[shell script] Question sur l'init d'une variable
[C++] question facileQuestion cookie
[MCD] Question au sujet d'une contrainteQuestion sur les gridview
Plus de sujets relatifs à : question sur les multi core et c++


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR