2017-02-17 30 views
0

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

У меня есть рабочая разреженная матрица Якоби. Я не знаю, могу ли я разместить

! $ OMP PARALLEL DO

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

x(:) = 0 
do p = 1, numIterations 
    do i=1, n 
     t=b(i) 
     do j = IA(i), IA(i+1) - 1 
      if j=i 
       d=A(j) 
      else 
       t = t - A(j) * x(jA(j)) 
      end if 
     end do 
     x(i) = t/d 
    end do 
end do 
+0

Якоби может быть не самым простым способом для распараллеливания - считаете ли вы другие типы решателей? – Chaosit

+0

Это выглядит как ошибка '' if j = i' ' –

ответ

2

Это правда, у вас есть зависимость от t во внутреннем цикле, так как он используется в качестве аккумулятора. Однако это также означает, что у вас может быть личная копия t в каждом из потоков (так как массивы A и x не записываются в цикле, значение t зависит только от значения j, что также является потоком частного).

Следующие должны работать:

x(:) = 0 
do p = 1, numIterations 
    do i=1, n 
     t=0 
     !$OMP PARALLEL DO 
     !$OMP REDUCTION(+:t) 
     do j = IA(i), IA(i+1) - 1 
      if j=i 
       d=A(j) 
      else 
       t = A(j) * x(jA(j)) 
      end if 
     end do 
     x(i) = (b(i)-t)/d 
    end do 
end do 

Обратите внимание, что d можно записать только один из потоков, так что переменная может совместно использоваться betewen нитей, без каких-либо зависимостей петель переносимых на d.

+0

Я не очень уверен в openMP, но разве вы не должны добавлять '! $ OMP PRIVATE (t)', чтобы гарантировать, что не существует неявной сериализации по t? – Chaosit

+1

! $ OMP REDUCTION делает это автоматически (см. Https://computing.llnl.gov/tutorials/openMP/#REDUCTION), он делает все переменные в списке частными (в противном случае это не имеет смысла) – simpel01

+0

Спасибо за ответ. Любой шанс, что вы можете объяснить предложение о сокращении. Документация немного нечеткая. «В конце сокращения переменная сокращения применяется ко всем частным копиям общей переменной, а конечный результат записывается в глобальную общую переменную». Означает ли это, что значения, подлежащие вычитанию, сохраняются, то все вычитаются из глобальной переменной после цикла? –