2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Тест FORTRAN+OpenAcc
Сообщение05.09.2019, 14:25 


08/03/11
186
Есть ли у кого нибудь возможность протестировать программу на nvidia p100 или v100?
Если не будет ошибки FATAL ERROR: FORTRAN AUTO ALLOCATION FAILED, попробуйте увеличить NUM в модуле, например, 2**11 (должны быть степени двойки).

код: [ скачать ] [ спрятать ]
Используется синтаксис Fortran
! pgfortran -o pro -fast -ta=nvidia mdl.f90 pro.f90
PROGRAM PRO

  USE MDL
 
  REAL(RK),PARAMETER                :: FRE = 0.123456789_RK
  REAL(RK),DIMENSION(2*NUM)         :: ARR
  REAL(RK),DIMENSION(10000,2*NUM)   :: DATA
  REAL(RK),DIMENSION(10000)         :: OUTPUT
  INTEGER                           :: I
 
  ARR = 0.0_RK
  ARR(1:2*NUM:2) = SIN(2._RK*PI*FRE*REAL([(I,I=1,2*NUM,2)],RK))
   
  DO I=1,10000,1
    DATA(I,:) = ARR
  END DO
 
  !$ACC DATA COPY(DATA(:,:)) COPYOUT(OUTPUT(:))
  !$ACC PARALLEL LOOP
  DO I=1,10000,1
    CALL FFRFT_(NUM,0.5_RK,DATA(I,:))
    OUTPUT(I) = SUM(DATA(I,:))
  END DO
  !$ACC END PARALLEL LOOP
  !$ACC END DATA
   
  WRITE(*,*) SUM(OUTPUT)

END PROGRAM PRO
 


код: [ скачать ] [ спрятать ]
Используется синтаксис Fortran
MODULE MDL

    IMPLICIT NONE
   
    INTEGER,PARAMETER  :: RK=SELECTED_REAL_KIND(15,307)
    INTEGER,PARAMETER  :: NUM=2**10
    INTEGER,PARAMETER  :: FLA=1
    REAL(RK),PARAMETER :: PI=3.141592653589793238460_RK
    REAL(RK),PARAMETER :: TWO_PI=2.0_RK*PI
           
    CONTAINS
   
    ! DISCRETE FOURIER TRANSFORM (NRF77)
    PURE SUBROUTINE FFT_(NUM,DIR,ARR)
        !$ACC ROUTINE SEQ
        INTEGER,INTENT(IN) :: NUM
        INTEGER,INTENT(IN) :: DIR
        REAL(RK),DIMENSION(2*NUM),INTENT(INOUT) :: ARR
        INTEGER :: N,I,J,M,LIM,STE
        REAL(RK) :: PIM,PRE,ANG,WR,WI,WPR,WPI,WX,MUL
        N=2*NUM
        J=1
        MUL = REAL(DIR,RK)*TWO_PI
        DO I=1,N,2
            IF(J.GT.I)THEN
                PRE=ARR(J)
                PIM=ARR(J+1)
                ARR(J)=ARR(I)
                ARR(J+1)=ARR(I+1)
                ARR(I)=PRE
                ARR(I+1)=PIM
            ENDIF
            M=N/2
1           IF ((M.GE.2).AND.(J.GT.M)) THEN
                J=J-M
                M=M/2
                GOTO 1
            ENDIF
            J=J+M
        ENDDO
        LIM=2
2       IF (N.GT.LIM) THEN
            STE=2*LIM
            ANG=MUL/REAL(LIM,RK)
            WPI=SIN(ANG)
            ANG=SIN(0.5_RK*ANG)
            WPR=-2.0_RK*ANG*ANG
            WR=1.0_RK
            WI=0.0_RK
            DO M=1,LIM,2
                DO I=M,N,STE
                    J=I+LIM
                    PRE=WR*ARR(J)-WI*ARR(J+1)
                    PIM=WR*ARR(J+1)+WI*ARR(J)
                    ARR(J)=ARR(I)-PRE
                    ARR(J+1)=ARR(I+1)-PIM
                    ARR(I)=ARR(I)+PRE
                    ARR(I+1)=ARR(I+1)+PIM
                ENDDO
                WX=WR
                WR=WR*WPR-WI*WPI+WR
                WI=WI*WPR+WX*WPI+WI
            ENDDO
            LIM=STE
            GOTO 2
        ENDIF
    END SUBROUTINE FFT_
   
    ! DISCRETE (LINEAR) FRACTIONAL FOURIER TRANSFORM
    PURE SUBROUTINE FFRFT_(NUM,PAR,ARR)
        !$ACC ROUTINE SEQ
        INTEGER,INTENT(IN) :: NUM
        REAL(RK),INTENT(IN) :: PAR
        REAL(RK),DIMENSION(2*NUM),INTENT(INOUT) :: ARR
        INTEGER :: I
        REAL(RK) :: FAC
        REAL(RK),DIMENSION(NUM)   :: MUL,COS_MUL,SIN_MUL
        REAL(RK),DIMENSION(4*NUM) :: ONE,TWO,TRE
        REAL(RK),DIMENSION(2*NUM) :: TMP
        FAC=PAR*PI/REAL(NUM,RK)
        MUL=FAC*REAL([(I-1,I=1,NUM,1)],RK)**2
        COS_MUL=COS(MUL)
        SIN_MUL=SIN(MUL)
        ONE(1:2*NUM:2)=ARR(1:2*NUM:2)*COS_MUL-ARR(2:2*NUM:2)*SIN_MUL
        ONE(2:2*NUM:2)=ARR(1:2*NUM:2)*SIN_MUL+ARR(2:2*NUM:2)*COS_MUL
        TWO(1:2*NUM:2) = +COS_MUL
        TWO(2:2*NUM:2) = -SIN_MUL
        ONE(2*NUM+1:4*NUM:1)=0.0_RK
        MUL=-FAC*REAL([(I-1-2*NUM,I=NUM+1,2*NUM,1)],RK)**2
        TWO(2*NUM+1:4*NUM:2)=COS(MUL)
        TWO(2*NUM+2:4*NUM:2)=SIN(MUL)
        CALL FFT_(2*NUM,+1,ONE)
        CALL FFT_(2*NUM,+1,TWO)
        TRE=ONE
        ONE(1:4*NUM:2)=TRE(1:4*NUM:2)*TWO(1:4*NUM:2)-TRE(2:4*NUM:2)*TWO(2:4*NUM:2)
        ONE(2:4*NUM:2)=TRE(1:4*NUM:2)*TWO(2:4*NUM:2)+TRE(2:4*NUM:2)*TWO(1:4*NUM:2)
        CALL FFT_(2*NUM,-1,ONE)
        ARR=ONE(1:2*NUM:1)/REAL(2*NUM,RK)
        TMP=ARR
        ARR(1:2*NUM:2)=TMP(1:2*NUM:2)*COS_MUL-TMP(2:2*NUM:2)*SIN_MUL
        ARR(2:2*NUM:2)=TMP(1:2*NUM:2)*SIN_MUL+TMP(2:2*NUM:2)*COS_MUL
    END SUBROUTINE FFRFT_
   
END MODULE MDL
 

 Профиль  
                  
 
 Re: Тест FORTAN+OpenAcc
Сообщение17.09.2019, 13:56 
Аватара пользователя


30/04/19
235
У меня программа скомпилировалась, запустилась и отработала. Но похоже только на процессоре, хотя видюха и Nvidia (старая GT630), OS Linux, драйвер видео установлен. Вероятно что-то где-то отключено. NUM пробовал поставить 2**11, отработало. Или может при компиляции какие-то особые опции для видеокарточки задавать нужно?

 Профиль  
                  
 
 Re: Тест FORTAN+OpenAcc
Сообщение20.09.2019, 08:49 


08/03/11
186
Если вы использовали мою команду для сборки на pgfortran, то должна собираться под gpu. Но она должна была выдать такую же ошибку, здесь это, как оказалось, не зависит от конкретной gpu, а зависит от device heap, который 8мегабайт по умолчанию, по крайней мере с pgfortran. Для этого компилятора можно задать переменную PGI_ACC_CUDA_HEAPSIZE с размером больше 8мегабайт и этой проблемы не будет.

 Профиль  
                  
 
 Re: Тест FORTRAN+OpenAcc
Сообщение21.09.2019, 02:30 
Аватара пользователя


30/04/19
235
Просмотрел Вашу строчку компиляции. Но видио мой компилятор не понимает те команды которые Вы использовали для своего компилятора, если опцию -fast (вероятно ключ оптимизации) я меняю на -O1(2...3), то -ta=nvidia не знаю чем заменить, на эту команду компилятор ругается. Возможно нужно доустанавливать что-то.

Цитата:
unrecognized command line option ‘-ta=nvidia’

 Профиль  
                  
 
 Re: Тест FORTRAN+OpenAcc
Сообщение21.09.2019, 04:06 


08/03/11
186
Да, неявно предлагалось использовать pgfortran, в принципе можно использовать gfortran с флагами -O3 -fopenacc, но там требуются небольшие изменения в использовании acc директив.

 Профиль  
                  
 
 Re: Тест FORTRAN+OpenAcc
Сообщение22.09.2019, 02:44 
Аватара пользователя


30/04/19
235
sithif в сообщении #1416328 писал(а):
в принципе можно использовать gfortran с флагами -O3 -fopenacc, но там требуются небольшие изменения в использовании acc директив.

Да, компилятор gfortran. Но OpenAAC то не установлен. Попробовал поставить, не знаю все ли что нужно поставилось. Теперь ругнулось на !$ACC ROUTINE SEQ

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group