OpenMP - выполнение потоков на чанках - PullRequest
0 голосов
/ 29 июня 2010

У меня есть следующий фрагмент кода, который я хочу сделать параллельным определенным образом.Я делаю ошибку, и, следовательно, не все потоки запускают цикл так, как я думал.Было бы здорово, если бы кто-нибудь помог мне определить эту ошибку.

Это код для расчета гистограмм.

#pragma omp parallel default(shared) private(iIndex2, iIndex1, fDist) shared(iSize, dense) reduction(+:iCount)
{

chunk = (unsigned int)(iSize / omp_get_num_threads());
threadID = omp_get_thread_num();
svtout << "Number of threads available " << omp_get_num_threads() << endl;
svtout << "The threadID is " << threadID << endl;

//want each of the thread to execute the loop
    for (iIndex1=0; iIndex1 < chunk; iIndex1++)
    {
        for (iIndex2=iIndex1+1; iIndex2 < chunk; iIndex2++)
        {   
            iCount++;

            fDist = (*this)[iIndex1 + threadID*chunk].distance( (*this)[iIndex2 + threadID*chunk] );
            idx = (int)(fDist/fWidth);

            if ((int)fDist % (int)fWidth >= 0)
            {
               #pragma omp atomic
               dense[idx] += 1;
            }  
}
}

Переменная iCount отслеживает количество итераций, и язаметил, что есть заметная разница между последовательной и параллельной версией.Я предполагаю, что не все потоки работают, и, следовательно, значения гистограммы, которые я получаю из параллельной программы, намного меньше, чем фактические показания (плотный массив хранит значения гистограммы).

Спасибо,
Саян

1 Ответ

2 голосов
/ 29 июня 2010

Вы циклически обрабатываете чанк, а не iSize с несколькими потоками.Попробуйте заменить границы цикла на iSize.

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