2016-03-20 24 views
1

Açık kodlu kodumu paralelleştirirken Fortran 90'daki dizilerde bazı öğe-temelli hesaplama yapmak istiyorum. Şimdi aşağıdaki kodu vardır: Ben diziler x ve ayrılabilir diziler r statik yerine şimdi istiyorumAllocatable dizi için Openmp paralel iş akışı

program test 
implicit none 

integer,parameter :: n=50 
integer :: i 
integer(8) :: t1,t2,freq 
real(8) :: seq(n),r(n,n,n,n) 
real(8),dimension(n,n,n,n) :: x 

call system_clock(COUNT_RATE=freq) 

seq=[(i,i=1,n)] 
x=spread(spread(spread(seq,2,n),3,n),4,n) 

call system_clock(t1) 

!$omp parallel workshare 
! do some array calculation 
r=atan(exp(-x)) 
!$omp end parallel workshare 

call system_clock(t2) 

print*, sum(r) 
print '(f6.3)',(t2-t1)/real(freq) 

end program test 

, bu yüzden yazın:

real(8),dimension(:,:,:,:),allocatable :: x,r 
allocate(x(n,n,n,n)) 
allocate(r(n,n,n,n)) 

ancak hatasız seri program çalıştırmak olduğunu ve derleyici "! $ omp parallel workshare" satırını dikkate almaz.

Bu durumda paralelleştirmek için hangi seçenekleri kullanmalıyım? omp parallel do ile döngüleri denedim ama çok daha yavaş.

ben pencerelerde gfortran 5.1.0 ile benim kod derleme ediyorum:

gfortran -ffree-form test.f -o main.exe -O3 -fopenmp -fno-automatic 
+0

* "Fakat öyle görünüyor ki! $ Omp parallel workhare allocatable dizi için çalışmıyor." * Neden? * "Göründü" * ne demektir? * * Işe yaramaz * ne demektir? Hiçbir şey ifade etmeyen bu ifadeyi kullanmayın. Neyi denediniz ve hangi hatalarla karşılaştığınızı söyleyin. BTW, 'gerçek (8)' çirkin: http://stackoverflow.com/questions/838310/fortran-90-kind-parameter/856243#856243 http://stackoverflow.com/questions/3170239/fortran-integer4- vs-integer4-vs-integerkind-4/3170438 # 3170438 –

+0

Programın seri olarak hatasız çalıştığı ve derleyicinin "! $ omp parallel workshare" satırını dikkate almadığı anlamına gelir. – x1hgg1x

+1

İlgili: https://stackoverflow.com/questions/17812003/parallelization-of-elementwise-matrix-multiplication/17832699#17832699 –

cevap

4

Daha önce gfortran bu konuda rastlamak var. çözüm aşağıdaki formda dizi belirtmektir:

İşte
!$omp parallel workshare 
! do some array calculation 
r(:,:,:,:) = atan(exp(-x)) 
!$omp end parallel workshare 

reference olduğunu.

+0

Benim için çalışıyor. Aslında bunu statik dizilerle denedim ama fark etmedim, böylece onu çıkardım. Yani fark sadece allocatable dizi için görülür. – x1hgg1x

+0

@ VladimirF Makinemde gfortran 5.3.1 ile sorun hala mevcut. –

+3

Belki de cevabın sürümünün çalışmasının sebebi, r = atan (exp (-x)) 'ini yapamazken, r'nin ayrılabilir olduğunu ve _düğünün bir bütün olarak atanmasıdır. Bu, paralel paylaşımın devre dışı bırakılmasını tetikleyebilecek bir yeniden tahsisatın gerekli olabileceği anlamına gelir. Öte yandan, 'r (:,:,:, :)' ifadesinin kullanılması, ifade sonucunun _existing_ array r'ye atanmasını zorlar - muhtemelen yapılandırma yapılandırmanıza bağlı olarak sınırlar uyuşmazsa bir hata ortaya çıkarır. –