From 04:00 PM CDT – 08:00 PM CDT (09:00 PM UTC – 01:00 AM UTC) Tuesday, April 16, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

Discussions au sujet de NI LabVIEW

annuler
Affichage des résultats de 
Rechercher plutôt 
Vouliez-vous dire : 

vi récursif - vitesse

Bonjour à tous,

 

Un VI récursif "toto" ... à l'intérieur des sous-VIs.

 

"toto" est le "main_récursif", et est, bien entendu, configuré en "shared clone".

 

mais les sous-VIs internes ...

 

La vitesse d'exécution la plus élevée de "toto" (soit "toto" et l'ensemble de ses sous-VIs")

se présente quand la totalité des sous-VIs sont configurés en "Preallocated clone reentrant + inline subVI"

 

ordre de grandeur :

 

si tous les sous-VIs sont en "shared clone" : 37 sec

si tous les sous-VIs sont en "Preallocated clone reentrant + inline subVI" : 13 sec

soit, globalement, 3x plus vite.

(les résultats obtenus en sortie de "toto" sont parfaits dans les deux cas)

 

Pourquoi ?

 

Je comprends que l'option "inline subVI" me fasse gagner en vitesse.

Mais "Preallocated clone reentrant" ???? ... pourquoi "preallocated clone" me fait gagner autant de vitesse par rapport à "shared clone" ?

 

"toto" est un VI récursif, donc le compilateur de Labview ne connaît pas (au départ) le nombre d'imbrications.

Quand "toto" appelle "toto" (recursivité), Labview doit donc réallouer un clone pour chaque sous-VIs (ou pas ???? je ne sais pas)

Cette "pré-allocation" ne conserne (je pense) que l'espace mémoire et non le code.

Quoi qu'il en soit, ces nouvelles pré-allocation à chaque appel de toto (par toto) devrait me faire perdre du temps, or j'en gagne.

 

Dans la doc disponible sur labview,

je trouve des infos sur "preallocated clone", sur "inline subvi" ... mais très peu sur les deux en même temps.

 

Il me manque manifestement des éléments de compréhension.

Si un d'entre vous peut m'éclairer, ce serait un gros "plus" pour moi.

 

merci.

0 Compliments
Message 1 sur 5
3 799 Visites

Hello ouadji,

 

Je ne suis pas certain de tout comprendre, il semble qu'il ne soit pas possible d'être inline et récurcif:

http://zone.ni.com/reference/fr-XX/help/371361L-0114/lvconcepts/vi_execution_speed/ (paragraphe Temps système des sous-VIs.

 

Ceci ne change au problème de vitesse tu vas me dire 😉

 

(Est-ce que tu as un bon de code pour discuter de quelque chose de concret? )

 

Quand on préalloue, le temps d'appel est constant, alors que lorsqu'on partage des clones, on peut se retrouver dans la situation où l'on attend la libération d'un clone ou la création d'un nouveau clone.

 

Bonne soirée

 

Flo

0 Compliments
Message 2 sur 5
3 775 Visites

pas "inline et récursif" .... mais .... "inline et preallocated clone"

 

Je ne parle pas du VI principal ... seul ce VI principal fait appel à lui-même.

 

mais dans le code de ce "VI principal", il y a des sous-VIs (ces sous-VIs ne font pas appel à eux-même)

 

Quand je parle de "preallocated clone + inline", je parle uniquement des sous-VIs.

 

autrement dit :

 

A est récursif ... A fait appel à A

A est configuré : shared clone (obligé pour un VI récursif)

 

dans A, j'ai un sous-VI B.

B est configuré : preallocated clone + inline

 

J'insiste sur le fait que le sous-VI B n'est PAS récursif ... puisque B n'appelle pas B

Mais B fait partie du code de A ... qui lui est récursif, puisque A fait appel à A.

 

Un VI récursif (shared clone)  peut parfaitement contenir un sous-VI configuré preallocated+inline,

LV accepte sans problème et cela tourne parfaitement.

 

du concret ?

 

il s'agit du code de mon chessgame ... en particulier ChessCore.vi

ChessCore.vi (qui est récursif) contient des sous-VIs.

Si ces sous-VIs sont "preallocated clone+ inline" ... ChessCore.vi tourne 2,5 à 3 fois plus vite que si ces sous-VIs sont "shared clone".

 

un VI récursif DOIT obligatoirement être configuré "shared clone".

Mais ... ! ... les sous-VIs contenus dans ce "main_récursif" ne doivent pas être obligatoirement configurés de la même façon.

Un sous-VI faisant partie du code d'un VI récursif peut parfaitement être "non-réentrant".

 

Et c'est bien là la source de mon étonnement et de ma question.

Plusieurs configurations sont possibles pour les sous-VIs (non-réentrant, shared, shared inline, preallocated, preallocated inline)

C'est quand je configure l'ensemble des sous-VIs en "preallocated+inline" que ChessCore est le plus rapide (avec une grosse différence)

 

Pourquoi ?

 

Quand on préalloue, le temps d'appel est constant, alors que lorsqu'on partage des clones,

on peut se retrouver dans la situation où l'on attend la libération d'un clone ou la création d'un nouveau clone

 

Serait-ce là la raison ?

 

 

 

0 Compliments
Message 3 sur 5
3 771 Visites

par curiosité (même si cela n'est pas a ta question )

 

as tu regardé la différence sur la consommation de la mémoire ?

0 Compliments
Message 4 sur 5
3 749 Visites

Non ... mais je suis persuadé que "preallocated clone" (et en plus "inline") ... est la configuration qui consomme le plus de mémoire.

 

(un peu par définition de ces deux options)

 

Le but premier est la vitesse (même si cela doit occuper plus de mémoire)

 

Ceci dit ... ça ne consomme certainement pas 100Mo en plus !

 

Il est bien connu que "mémoire" et "vitesse" ne vont pas ensemble, c'est l'un ou l'autre.

 

 

0 Compliments
Message 5 sur 5
3 746 Visites