Переполнение int в OpenMP - PullRequest
       4

Переполнение int в OpenMP

0 голосов
/ 11 марта 2011

Я пытаюсь написать наивную функцию indexOf. В настоящее время работает и получает правильную позицию. Однако он переполняется при подсчете количества сравнений. Я попытался преобразовать их все в длинные длинные целые, но это, кажется, не имеет никакого значения. Что я могу сделать, чтобы это исправить?

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;
}

1 Ответ

1 голос
/ 14 марта 2011

Переменная totalCom является int; это, скорее всего, вызывает переполнение. Кроме того, вам не нужно #pragma omp critical для обновления totalCom; вместо этого добавьте reduction(+ : totalCom) в заголовок parallel for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...