Gambas France BETA


Pas de compte ? Incription

Calculs en parallele et multi-proc

1
AuteurMessages
Counia#1 Posté le 31/8/2013 à 01:31:02
Bonjour,
j'ai un programme gourmand en calcul mathématique.
Partant du constat que la plupart des processeurs modernes embarques plusieurs unités et que dans mon cas une seule est chargée par un calcul , comme mes formules sont connues à l'avance l'idée d'en lancer quatre en parallèle me séduit (car quatre unités dans mon i5).

Donc ma question:
Serait-il possible en Gambas de paralléliser ces calculs (un par unités du µP) ?
Et comment déterminer combien d'unité de calcul compose le processeur ?
Merci pour votre aide.



Jack#2 Posté le 2/9/2013 à 22:29:26
Salut Counia,

je vais te proposer d'attendre un gourou :scratch: , s'il y en a un qui passe par là. Ou alors de poster directement sur le forum de Gambas.
Pour un code démocratique nationalisons Gambas.
Prokopy#3 Posté le 5/9/2013 à 00:34:49
Kinder PinguiSalut Counia,

Depuis la version 3.3 de Gambas, il y a la nouvelle classe Task qui devrait t'intéresser, car elle permet de créer des tâches de fond.
En gros, cela te permet de créer des sous-processus qui vont s'exécuter en parallèle du programme principal et qui, normalement, seront répartis automatiquement par le système sur les différents processeurs ou cœurs disponibles.

Si tu fais beaucoup de calculs mathématiques gourmands, tu devrais jeter un œil au nouveau compilateur "juste-à-temps" de Gambas (depuis la version 3.2). Il te permet de compiler ton programme juste avant son démarrage et ainsi de beaucoup l'accélérer. Les résultats varient selon les programmes, mais de mémoire l'exemple Mandelbrot bénéficie d'une accélération par 20 avec (c'est en général très efficace sur les programmes purement mathématiques et/ou algorithmiques).
Pour l'utiliser, il te suffit d'installer le composant gb.jit sur ton système (s'il ne l'est pas déjà), et d'ajouter le mot-clé Fast devant tes fonctions, par exemple :

1
2
3
FAST PUBLIC SUB Fonction()
'Calculs ...
END


Voici aussi un petit exemple d'utilisation de Tasks :

Classe "Calculator" :

1
2
3
4
5
6
7
8
9
10
11
12
13
' Gambas class file

INHERITS Task 'Pour faire en sorte que les objets deviennent des tâches de fond

PUBLIC A AS INTEGER 'Nos deux facteurs
PUBLIC B AS INTEGER

PUBLIC SUB Main() AS INTEGER

SLEEP 1 'Ici on simule de très gros calculs qui prennent du temps
RETURN a * b

END


Module principal :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
' Gambas module file

PUBLIC SUB Main()

DIM calculator1 AS NEW Calculator AS "Calculator" 'On instancie nos deux classes
DIM calculator2 AS NEW Calculator AS "Calculator"

calculator1.A = 2 'On donne les infos à nos tâches
calculator1.B = 3

calculator2.A = 4
calculator2.B = 5

'Une fois instanciées, les tâches vont démarrer automatiquement

END

PUBLIC SUB Calculator_Kill() 'Quand une tâche a terminé, cet évènement est lancé

DIM calculatorSource AS Calculator = LAST

PRINT calculatorSource.A; " * "; calculatorSource.B; " = "; calculatorSource.Value

END
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
linuxos#4 Posté le 12/9/2013 à 04:42:01
Un peu de sel, de poivre et la crevette sera... Bonjour a tous,
Juste un petite précision quant a l'utilisation de TASK, il est fortement recommandé de ne pas avoir de partie graphique, Form ou autres.

En effet j'ai testé la fonctionnalité TASK qui permet de 'Forker' (exécution d'une fonction en tache de fond) un process dans mon application qui a une interface graphique et le résultat est sans appel, a forte dose, 100 000 process lancés au total a raison de 15 en parallèle, je me retrouve aléatoirement avec une erreur X11.

Benoit m'a bien confirmé que TASK pas trop compatible avec gb.qt ou gb.gtk utilisé par des Form ou autres.

Si besoin, j'ai développé une autre méthode mais qui ne s'applique que si des process extérieurs sont invoqués par la commande SHELL ou EXEC.
Avec 700 000 process exécutés a raison de 40 simultanément environ (pour tester), je n'ai eu aucune perte ni anomalie.

Cette méthode est relativement plus complexe car elle est beaucoup plus tournée OBJET dans son écriture Gambas.

Sinon, si tu rencontre des problème avec TASK dans ton programme, créer un programme unique en console, sans partie graphique, pour l'utiliser et éviter d'éventuels problème X11.

Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
gambix#5 Posté le 18/9/2013 à 11:20:14
Faire simple !C'est vrai et pas ... Regarde l'exemple fractale dans la svn.

Il ne faut pas appeler des éléments de qt à partir du process... Mais utiliser un des résultat derrière un timer reste possible
Moins de texte dans une signature c'est agrandir son espace.
1