2016-09-17 9 views
-1

В моем решении 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, так как она является своего рода дизайн сверху вниз с более простой отладки, разработки и обслуживания , но я отношусь к обработке нагрузки этого метода.

+2

Какие измерения вы сделали до сих пор, чтобы внести свой вклад в ваше мышление о загрузочных нагрузках двух вариантов, которые вы наметили? –

+0

На самом деле никаких измерений. Раньше я реализовал как методы, так и метод 1, казалось, занимал больше времени. – Shaqpad

+0

Так вы нас просите сделать для вас работу? Вы должны сделать некоторые измерения. Ваш код слишком неполный, и нет очевидной причины большой разницы в производительности. –

ответ

1

Если ваши подпрограммы sub_1, , ... находятся в том же файле, что и подпрограмма драйвера, тогда компилятор (без какой-либо конкретной опции) имеет всю информацию, чтобы выбрать встроенные функции или нет. Если вы встроили подпрограммы самостоятельно, вы дадите компилятору любой выбор. В лучшем случае, это будет хороший выбор, чтобы сделать inlining, и вы не увидите никакой разницы, потому что компилятор также выберет его. В худшем случае вы увидите замедление, потому что компилятор будет выбирать не встроенный.

Конечно, я полагаю, что у вас нет скомпилированного исполняемого файла (потому что ваш компилятор плохой или потому, что у него есть неприспособленные параметры, такие как -O0).

Как правило, лучше, чтобы компилятор выбрал лучшую стратегию, и это может зависеть от вашей архитектуры и кода. Возможно, выбор не может быть одинаковым для процессора Xeon или Power. Лучшее, что вы можете сделать, это предоставить как можно больше информации для компилятора с помощью опций и директив (справочная страница - хороший старт) и позволить ей выполнять свою работу.