2016-10-07 15 views
0

В настоящее время я пытаюсь ускорить решение растворителей спектральных элементов, портируя большинство подпрограмм на GPGPU с использованием OpenACC с помощью компилятора PGI (15.10). Исходный код написан в OO-Fortran. Это программное обеспечение имеет «слои» подпрограмм, которые вызывают другие функции и подпрограммы. Чтобы перенести код на GPU с помощью openacc, я сначала пытался разместить директивы «$ acc» в каждой процедуре, которую нужно портировать. Во время компиляции, используя "pgf90 -acc -Minfo = Accel", я получаю следующее сообщение об ошибке:Как программа под управлением Fortran-OpenACC вызывает другую процедуру Fortran-OpenACC?

nvvmCompileProgram error: 9.

Error: /tmp/pgacc2lMnIf9lMqx8.gpu (146, 24): parse invalid forward reference to function 'innerroutine_' with wrong type!

PGF90-S-0155-Compiler failed to translate accelerator region (see -Minfo messages): Device compiler exited with error status code (Test.f90: 1)

Этих же проблема может быть воспроизведена с помощью следующего простого Фортрана:

PROGRAM Test 
IMPLICIT NONE 

CONTAINS 

SUBROUTINE OuterRoutine(sol, xF, N) 
!$acc routine 
    IMPLICIT NONE 
    INTEGER :: N 
    REAL(KIND=8) :: sol(0:N,1:3) 
    REAL(KIND=8) :: xF(0:N,1:3) 
    ! LOCAL 
    INTEGER :: i 

     DO i = 0, N 
     xF(i,1:3) = InnerRoutine(sol(i,1:3)) 
     ENDDO 

END SUBROUTINE OuterRoutine 
FUNCTION InnerRoutine(sol) RESULT(xF) 
!$acc routine 
    IMPLICIT NONE 
    REAL(KIND=8) :: sol(1:3) 
    REAL(KIND=8) :: xF(1:3) 

     xF(1) = sol(1)*sol(2) 
     xF(2) = sol(1)*sol(3) 
     xF(3) = sol(1)*sol(1) 

END FUNCTION InnerRoutine 

END PROGRAM Test 

Опять же, составление эта программа с «pgf90 -acc -Minfo = accel» дает проблему.

Поддерживает ли openacc подпрограмму с включенной поддержкой вызова других подпрограмм с включенной поддержкой?

Если да, то что я делаю неправильно?

ответ

1

Вы используете правильную инструкцию OpenACC. Проблема здесь в том, что мы (PGI) еще не поддерживаем использование «подпрограмм» с функциями, зависящими от массива. Проблема в том, что эта поддержка требует от компилятора создания временного массива для хранения возвращаемого значения. Это означает, что каждый поток должен будет выделять этот массив темп, вызывая серьезное снижение производительности. Хуже, как обращаться с разделяющим массивом temp, если это банда или рабочий уровень.

У нас есть открытые запросы для этой функции, но может быть некоторое время, прежде чем мы сможем ее решить. В то же время, можете ли вы попробовать встраивать рутину? т. е. скомпилировать с помощью «-Minline».

+0

Thanks Mat. После добавления встроенного флага компиляция протекает без проблем в тестовом коде и, похоже, устраняет эту проблему в исходном коде, над которым я работал. –

+0

Обратите внимание, что не рекомендуется оставлять приветствия в вопросах и ответах. Ваше имя уже находится ниже сообщения. http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts http://meta.stackoverflow.com/questions/251077/my-opening -hi-all-in-my-question-keep-исчезает. Обычно я удаляю их. –

+0

Хорошо офицер. Ваше заявление добавило в эту тему многое необходимое. Это тоже. –