CACULER UNE FACTORIELLE AVEC PLUSIEURS COEUR DE CALCUL ET AFFICHER LES TEMPS D'E

cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 - 25 juil. 2013 à 18:08
denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 - 2 août 2013 à 15:51
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/55268-caculer-une-factorielle-avec-plusieurs-coeur-de-calcul-et-afficher-les-temps-d-executions

denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1
2 août 2013 à 15:51
Note de l'expert : Une petite précision vos différents threads ne doivent pas appeler des objet local à la procédure qui créer les threads mais des variables globales à l'unité ou bien encapsulé-les dans chacun des threads.
denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1
2 août 2013 à 01:47
Le nombre de coeur multiplie la fréquence du processeur : Vrai

Un processeur équipé d'un double coeur permet d'effectuer des programmes dont la fréquence total double. En effet, si pour une action donné, vous pouvez répartir le nombre d'opération sur chacun des coeurs Alors vous obtiendrais une fréquence cumulé égale à la somme des fréquences cumulées des deux coeurs.
denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1
2 août 2013 à 01:46
En effet dès que l'on utilise une boucle for i=indice to une_fin ou peut alors segmenter son code de cette façon pour répartir des calculs élémentaires sur chaque unité de traitement qui vont aussi agir simultanément et ainsi gagner autant de cycles machine que le temps total d'exécution qui cette fois ci est divisible pour le nombre d'unité de coeur de calcul de ton µ-micro-processeur.
denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1
2 août 2013 à 01:38
Comme tu peut le voir les cours d'automatisme servent à quelque chose en effet jusqu'a présent je voyait des thread (des tache en français) lancée en l'air sans qu'il y ai de synchronisation - ce qui m'a moi aussi laisser septique pendant un moment mais j'ai finit par réaliser ce code et de multiple autre dans mon logiciel afin d'utiliser plusieurs coeur de calcul simultanément et en parallèle pour qu'ils agissent de concert!...
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
30 juil. 2013 à 18:35
Zip modifié
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
26 juil. 2013 à 16:08
les fichiers *.dcu; *.dof; *.~pas; *.~dfm; *.cfg; et *.dsk
sont a supprimer du Zip


Merci
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
25 juil. 2013 à 20:26
Merci pour ces précisions!
ça me servira bientôt...

A+
denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1
25 juil. 2013 à 19:07
Tu peut noter l'initialisation de la variable ThreadsRunning qui est décrémenter à l'intérieur d'un mutex pour déclarer une zone d'exclusion mutuel - Deux processus simultanés ne pourrons pas accéder à cette variable mais l'un après l'autre de façon a obtenir une décrémentation unique à un moment donné. Tu peut voir que le thread d'attente se termine que ThreadsRunning est égale à zéro
pour rendre la main à ton programme avec la méthode WaitFor (la fin de son exécution). Si j'avais une machine équipé de rayon X je serait bien heureux de voir la circulation des flux mémmorielle de mon µmicroprocesseur
denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1
25 juil. 2013 à 18:49
La boucle de temporisation permet de comparaît avec un même calcul les différences entre un calcul mono-coeur et un calcul multi-coeur, Tu dois comprendre que ce n'est pas forcement automatique et ceci permet de comparer une exécution multi-threader ou simplement sur un coeur de calcul. En effet le temps de calcul et ce pourquoi j'ai écrit la boucle for j qui me permet de comparaît deux temps de calcul avec la fonction GetTickCount qui ainsi est différente de zéro car ces fonctions sont très rapide. Ce calcul est de surcroit très rapide et l'utilisation de plusieurs threads permet de le vérifier. Et ainsi d'attendre quand l'opération est effectuée sur plusieurs coeurs que les différents threads soient terminé et révolu. Comme tu peut le voir sur l'exemple que j'ai posté. Ainsi de grosse boucle de calcul peuvent être décomposé en partie plus réduite afin d'être exécuter de concert.
denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1
25 juil. 2013 à 18:22
La boucle de temporisation permet de faire en sorte que le compteur de temps obtenu avec gettickcount soit différent de zéro pour comparer les cycles entre un calcul mono-coeur et le même calcul multithreader (multi-tache). J'ai établi cette formulation qui permet vraiment d'utiliser plusieurs coeur de calcul en même temps puis de les synchroniser avec le thread d'attente qui vérifie que le nombre de ThreadsRunning soient différent de zéro pour poursuivre quand les différents threads sont terminé et révolu.
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
25 juil. 2013 à 18:08
Bj Denis,

J'ai parcouru le code rapidement et il va m'être utile car je n'ai pas fini de faire le tour de ces fichus threads!
De plus je ne connaissais pas l'utilisation des différents coeurs de l'ordi, je croyais que c'était windows qui gérait automatiquement!

J'ai pas trop approfondi, mais je ne vois pas l'utilité de ta boucle de temporisation!

for i:=1 to jusqua do
begin
n:=n*i;
//Boucle de temporisation
for j:=1 to 20000 do s:=sin(j);
end;

A+
Rejoignez-nous