2012-03-27 6 views
-1

У меня есть проблема я хотел бы распараллелить два для петель с OpenMP.Оптимизировать зависимые петли 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

Первым делом нужно удалить 'если (я! = J)' ... –

+0

Что 'swapTab' делать? –

+0

просто поменять 2 элемента массива: – Arkerone

ответ

1

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

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

swapTab(t,i,j) 

с чем-то вроде

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

(я не большая часть C++ программист, так игнорировать дефекты в синтаксисе.)

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

Смежные вопросы