我最近读到(here),纯子例程可以实现更好的并行化优化。假设这是真的,有没有一种方法可以让下面的例程变得纯粹?
subroutine diff_stag(operator,dfdh,f,T,dir,pad,gt)
implicit none
procedure(stencils_stag) :: operator
type(realField),intent(inout) :: dfdh
type(realField),intent(in) :: f
type(triDiag),intent(in) :: T
integer,intent(in) :: dir,pad,gt
integer :: i,j,k
select case (dir)
case (1)
!$OMP PARALLEL DO SHARED(T,f,gt)
do k=1+pad,f%s(3)-pad; do j=1+pad,f%s(2)-pad
call operator(dfdh%f(:,j,k),f%f(:,j,k),T,f%s(dir),dfdh%s(dir),gt)
enddo; enddo
!$OMP END PARALLEL DO
case (2)
!$OMP PARALLEL DO SHARED(T,f,gt)
do k=1+pad,f%s(3)-pad; do i=1+pad,f%s(1)-pad
call operator(dfdh%f(i,:,k),f%f(i,:,k),T,f%s(dir),dfdh%s(dir),gt)
enddo; enddo
!$OMP END PARALLEL DO
case (3)
!$OMP PARALLEL DO SHARED(T,f,gt)
do j=1+pad,f%s(2)-pad; do i=1+pad,f%s(1)-pad
call operator(dfdh%f(i,j,:),f%f(i,j,:),T,f%s(dir),dfdh%s(dir),gt)
enddo; enddo
!$OMP END PARALLEL DO
case default
stop 'Error: dir must = 1,2,3 in delGen_T in ops_del.f90.'
end select
end subroutine我认为,问题在于select用例引入了一个副作用,这是不允许的。
有没有一种方法可以对字段f%f(i,j,k)和dfdh%f(i,j,k)进行切片,以便不需要select case?
任何帮助都是非常感谢的!
发布于 2016-09-06 14:11:34
给定子例程不能成为纯例程,因为它包含STOP语句。
除此之外,该子例程是否可以变为纯的将取决于operator子例程是否为纯的(或者是否可以变为纯的),以及派生类型是否具有指针组件。
我不认为“动态切片”是相关的。
https://stackoverflow.com/questions/39339249
复制相似问题