Оптимизация зависимых циклов openmp - PullRequest
0 голосов
/ 28 марта 2012

У меня проблема, я хотел бы распараллелить два для циклов с openmp.

как оптимизировать этот цикл с помощью openmp:

void test(float** m,tab* t,int n){

    int i,j;
    float gain;
    for (i = 1; i < n; i++)
    {
        for (j = i + 1;] j < n; j++)
        {
            if (i != j)
            {
                gain=m[t[(i+n-1)%n]][t[j]] + m[t[i]][t[(j+1)%n]] - m[t[(i+n -1)%n]][t[i]] - m[t[j]][t[(j+1)%n]] 
                if (gain< 0)
                {
                    swapTab(t,i,j);
                }
            }
        }
    }
}

ТНХ.

1 Ответ

1 голос
/ 28 марта 2012

Как указывает Оли Чарльзуорт, порядок обхода элементов в ваших матрицах имеет значение, поэтому простое создание параллели для директивы вокруг самого внешнего цикла не будет работать.

Один из вариантов, который у вас есть, - этообменять некоторое пространство на время.Сделайте копию вашего массива T (назовите его T').В итерации 1 вы бы заменили свою строку:

swapTab(t,i,j)

чем-то вроде

 T'[j][i] = T[i][j]

(я не очень программист на C ++, поэтому игнорирую дефекты синтаксиса.)

Во второй итерации вам нужно сначала скопировать T' обратно в T, а затем продолжить.НЕ ДЕЛАЙТЕ этого - установите указатели (возможно, Tnew, Told) на T и T' и переключайте указатели так, чтобы Told всегда указывал на массив для чтения, и Tnew всегда указывает на массив для записи.

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