IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Threads & Processus C++ Discussion :

Recherche dichotomique en parallèle


Sujet :

Threads & Processus C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 145
    Par défaut Recherche dichotomique en parallèle
    Bonjour.
    Je cherche à rendre parallèle la recherche dichotomique sous openMP. J'ai plusieurs questions à ce sujet:
    - est-il possible de paralléliser une fonction récursive (en limitant tout de même le nombre de récursion)... Je crois me souvenir qu'on ne peut pas faire de return dans un #omp parallel du coup ça risque de pausé problème pour la récursion non?
    - Sinon, j'essaye aussi de voir si je peux paralléliser la version itérative... Sauf que je ne suis pas sur si paralléliser une boucle while c'est possible...

    Voila les étapes d'un algo récursif que j'ai eu mais j'ai du mal à voir comment implémenter:
    • diviser la liste (ou le tableau) en p blocs de taille ceil(n/p), un bloc par proc
    • chaque processeur regarde à son bloc si la valeur cherchée y est
    • si c'est le cas, rediviser cette zone là en p blocs de taille ceil(n/p)
    • etc... jusque trouver la solution.


    en théorie je mettrais donc log n /log p (c'est dire log n base p) temps pour trouver vu que je divise mon problème à chaque fois en n sous problème...

  2. #2
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    openMP 3 fournit omp task qui est totu indiqué ici.

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    A part si la comparaison elle même est très coûteuse, j'ai intuitivement des doutes sur l'efficacité de paralléliser une simple opération de recherche par "n-chotomie".

    Je serais curieux de connaître le résultat en terme de performances.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par JolyLoic Voir le message
    A part si la comparaison elle même est très coûteuse, j'ai intuitivement des doutes sur l'efficacité de paralléliser une simple opération de recherche par "n-chotomie".

    Je serais curieux de connaître le résultat en terme de performances.
    Je dois avouer que, de manière tout à fait naïve, j'aurais tendance à être tout à fait de ton avis, et que j'ai peut etre tord sur ce coup ...

    En effet, même en considérant un abre parfait, il faudrait dores et déjà partir de l'ensemble des valeurs de niveau deux ou plus pour que la parallélisation ait un sens, or, il y aurait d'office une grande partie (pour ne pas dire une majorité) des cas qui aurait déjà été supprimé lors du parcours des niveaux précédents (dichotomie oblige)

    Je m'explique: soit un arbre de recherche (ou un tableau trié) proche de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
              8
            /  \
           /    \
          /      \
         /        \
        4          12
       /  \        / \
      2    6     10   14
     /\    /\    /\   /\
    1  3  5  7  9 11 13 15
    La recherche dichotomique te fera, fatalement, passer vers l'une des branches partant de 8, selon que la valeur recherchée est plus grande ou plus petite que 8, invalidant de facto "l'autre" branche, et il en ira de même pour tous les niveaux de l'arbre.

    Il ne servirait donc à rien d'essayer les branches dans lesquelles la logique a décidé de ne pas passer, car on a la certitude qu'elles ne contiennent pas la valeur recherchée.

    Maintenant, cette réflexion est exclusivement due au fait que je ne vois pas vraiment d'autre solution de parrallélisation, et donc, si quelqu'un a une idée de génie, qu'il se fasse connaitre
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Dans un cas de n-chotomie (je ne connais pas le vrai mot) au lieu de dichotomie, on peut faire (n-1) comparaisons en parallèle, c'est à peu près tout ce que je vois d'un premier abord.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 145
    Par défaut
    Mon problème est un peu tordu, c'est pas une n-chotomie simple (en anglais on dit p-ary search donc admettons que n-chotomie convienne).

    Le mot clé que je recherche peu apparaître plusieurs fois et je dois stocker les addresses vers lesquels ces mots clés pointent.
    Pourquoi faire tout ça en parallèle? Parce que déjà c'est dans le cadre d'un cours sur la programmation parallèle, mais aussi, la base contiendra jusqu'à plusieurs milliards d'entrées donc pour une quantité de données si importantes, l'algo parallèle sera plus rapide que l'algo séquentiel...

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 145
    Par défaut
    Citation Envoyé par Joel F Voir le message
    openMP 3 fournit omp task qui est totu indiqué ici.
    pardon?

  8. #8
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 145
    Par défaut
    hmm, après avoir regardé un peu des tutos là dessus sur internet, il me semble que c'est pour grosso modo paralléliser une boucle while, executant des tâches indépendantes. J'ai pas l'impression que cela corresponde bien à mon problème. Voila ce que j'ai pour le moment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    //sortedDATA est un char* contenant des entrées les unes à la suite des autres
    //une entrée = mot clé + addresse (collés)
    //on cherche keyword parmi les clés et on renvoies les addresses
    //correspondantes à chaque fois qu'on trouve keyword
    //on cherche au plus maxCount occurence de la clé.
    int pBinarySearch(char *sortedData,int ndata, char *keyword, char (*addresses)[ADDRESS_LEN], int maxCount)
    {
        int current_count = 0;
        vector <char*> keys;
        vector <Zone*> zones;
        //on extrait les clés qu'on met dans le vector keys
        //zones contiendra des zones ou le mot clé existe
        get_keys(sortedData,keys,ndata * ENTRY_LENGTH);
     
        const int chunk = (int)ceil((double)keys.size() / NT1);
     
        while(current_count<=maxCount)
        {
            #pragma omp parallel num_threads(NT1)
            {
                int low = omp_get_thread_num() * chunk;
                //if last thread, high is last key, if not it's key at end of chunk
                int high = (omp_get_thread_num() + 1 ) * chunk < keys.size() ?
                             (omp_get_thread_num() + 1 ) * chunk : keys.size() - 1;
     
                //if only 1 element and it corresponds to key we save
                //the address and increment counter
                if(high == low && memcmp(keys[low],keyword,KEYWORD_LEN))
                {
                    #pragma omp critical
                    {
                        memcpy(addresses[current_count],keys[low] + 16,ADDRESS_LEN);
                        current_count++;
                    }
                }
                else
                     //if keyword is in processors zone, we create a zone object that contains high
                     //and low limits of the zone to be explored nex
                    if(memcmp(keyword,keys[low],KEYWORD_LEN) >= 0 && memcmp(keyword,keys[high],KEYWORD_LEN) <= 0)
                    {
                        Zone* z = new Zone(low,high);
                        #pragma omp critical
                            zones.push_back(z);
                    }
     
            }//end omp parallel
            /*after this region, either each proc checked one element and added the address if necessary
            to the addresses array
                                        OR
             it checked if the element was in it's zone and put that zone in the zones vector*/
            if(!zones.empty())
                for(unsigned int i = 0; i < zones.size() ; ++i)
                {//for every zone in zones, we recursively call the function...
                    int zone_l = zones[i]->getLow();
                    char* subSortedData = (char*)malloc(sizeof(char)*zones[i]->getSize()*ENTRY_LENGTH);
                    //copy into subsorteddata, the data contained between low and high
                    //ie from sortedData + zone_l to sortedData + zone_h
                    memcpy(subSortedData,sortedData + zone_l,zones[i]->getSize()*ENTRY_LENGTH);
                    current_count += pBinarySearch(subSortedData,zones[i]->getSize(),keyword,addresses,maxCount - current_count);
                }
        }
        return current_count;
    }
    Bon alors, quand j'appelle mon algo, il me renvoi systématiquement maxCount + 1 et quand j'imprime addresses, je n'ai rien...
    Auriez-vous une idée d'où j'ai merdé?

  10. #10
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 145
    Par défaut
    Personne n'a une idée?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme : recherche dichotomique
    Par M.a.n.u. dans le forum C
    Réponses: 3
    Dernier message: 17/06/2006, 23h30
  2. recherche dichotomique sur chaînes de carctères
    Par contexte dans le forum Langage
    Réponses: 4
    Dernier message: 13/04/2006, 00h31
  3. Réponses: 23
    Dernier message: 10/01/2006, 13h33
  4. Recherche dichotomique
    Par remixtech dans le forum C
    Réponses: 4
    Dernier message: 06/01/2006, 18h39
  5. Recherche dichotomique
    Par Gryzzly dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 31/12/2005, 11h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo