2011-03-11 5 views
0

Je suis en train d'essayer d'écrire une fonction indexOf naïf. Il fonctionne actuellement et obtient la bonne position. Cependant, il déborde lorsque vous comptez le nombre de comparaisons. J'ai essayé de les convertir tous en long, mais ça ne semble pas faire de différence. Que puis-je faire pour résoudre ce problème?débordement int dans OpenMP

int hostMatch(long long int *comparisons) 
{ 
    long int i,j,k, lastI; 

    i=0; 
    j=0; 
    k=0; 
    lastI = textLength-patternLength; 
    *comparisons=0; 

    int lastIi = lastI+1; 
    int position = -1; 

    int numberThreads = 1; 
    int totalCom = 0; 

    #pragma omp parallel for default(none) num_threads(numberThreads) \ 
     shared(totalCom, position) \ 
     private(i,j,k) \ 
     firstprivate(lastIi,patternLength, textData, patternData) 
    for (i=0;i<lastIi;i++) 
    { 
     if (position != -1) 
     { 
      // found 
     } 
     else 
     { 
      k=i; 
      long long int count = 0L; 
      for (j=0;j<patternLength;j++) 
      { 
       count++; 
       if (textData[k] == patternData[j]) 
       { 
        if (j == patternLength - 1) 
        { 
         // found 
         position = i; 
        } 
       } 
       else 
       { 
        break; 
       } 
       k++; 
      } 
      #pragma omp critical (totalLock) 
      { 
       totalCom += count; 
      } 
     } 
    } 
    /* END OF PARALLEL SECTION*/ 
    printf("Total Comparisons = %i\n", totalCom); 
    (*comparisons) = totalCom; 
    return position; 
} 
+2

'totalCom' est un' int'; êtes-vous sûr que ce n'est pas la variable qui déborde? De même, vous n'avez pas besoin de '#pragma omp critical' pour mettre à jour' totalCom'; ajoutez 'reduction (+: totalCom)' dans votre en-tête 'parallel for' à la place. –

+0

merci, cela corrigé ce problème, mais maintenant im ayant des conditions de course faisant la variable de réduction se tromper – Kurru

+0

Vous avez une condition de concurrence sur la position, mais en utilisant la réduction avec totalCom devrait fonctionner correctement. – ejd

Répondre

1

La variable totalCom est un int; c'est plus susceptible de provoquer le débordement. En outre, vous n'avez pas besoin de #pragma omp critical pour mettre à jour totalCom; ajoutez reduction(+ : totalCom) dans votre en-tête parallel for à la place.