В моем решении CFD для каждого узла в каждом домене необходимо использовать несколько обширных вычислений в зависимости от индексов i, j, k и l. Домен является 3-D и имеет разрешение IMAX + 1 JMAX + 1 KMAX + 1.Повторное вызов нескольких подпрограмм или просто вызов расширенной подпрограммы один раз
Моя проблема заключается в повторной реализации этих очень обширных блоков.
Какой из двух следующих методов более эффективен и создает меньшую нагрузку на обработку?
Метод 1
MODULE module_of_method_1
IMPLICIT NONE
PRIVATE
INTEGER, PARAMETER, PUBLIC :: IMIN = 0 , &
IMAX = 1024, &
JMIN = 0 , &
JMAX = 1024, &
KMIN = 0 , &
KMAX = 1024, &
SITE = 32
CONTAINS
SUBROUTINE sub_1()
! very extentise bLock 1
END SUBROUTINE
SUBROUTINE sub_2()
! very extentise bLock 2
END SUBROUTINE
SUBROUTINE sub_3()
! very extentise bLock 3
END SUBROUTINE
END MODULE
PROGRAM driver_of_method_1
USE module_of_method_1
IMPLICIT NONE
INTEGER :: I, J, K, L
DO k = KMIN, KMAX
DO j = JMIN, JMAX
DO i = IMIN, IMAX
DO l = 0, SITE
SELECT CASE (case_expression(i, j, k, l))
CASE (case_selector_1)
CALL sub_1()
CASE (case_selector_2)
CALL sub_2()
CASE DEFAULT
CALL sub_3()
END SELECT
END DO
END DO
END DO
END DO
END PROGRAM
Метод 2
MODULE module_of_method_2
IMPLICIT NONE
PRIVATE
INTEGER, PARAMETER :: IMIN = 0 , &
IMAX = 1024, &
JMIN = 0 , &
JMAX = 1024, &
KMIN = 0 , &
KMAX = 1024, &
SITE = 32
CONTAINS
SUBROUTINE only_one_subroutine()
INTEGER :: I, J, K, L
DO k = KMIN, KMAX
DO j = JMIN, JMAX
DO i = IMIN, IMAX
DO l = 0, SITE
SELECT CASE (case_expression(i, j, k, l))
CASE (case_selector_1)
! very extentise bLock 1
CASE (case_selector_2)
! very extentise bLock 2
CASE DEFAULT
! very extentise bLock 3
END SELECT
END DO
END DO
END DO
END DO
END SUBROUTINE
END MODULE
PROGRAM program_of_method_2
USE module_of_method_2
IMPLICIT NONE
CALL only_one_subroutine()
END PROGRAM
Я предпочитаю метод 1, так как она является своего рода дизайн сверху вниз с более простой отладки, разработки и обслуживания , но я отношусь к обработке нагрузки этого метода.
Какие измерения вы сделали до сих пор, чтобы внести свой вклад в ваше мышление о загрузочных нагрузках двух вариантов, которые вы наметили? –
На самом деле никаких измерений. Раньше я реализовал как методы, так и метод 1, казалось, занимал больше времени. – Shaqpad
Так вы нас просите сделать для вас работу? Вы должны сделать некоторые измерения. Ваш код слишком неполный, и нет очевидной причины большой разницы в производительности. –