Pull to refresh
0

Авто-векторизация и авто-распараллеливание c Guided Auto-parallelization(GAP)

Reading time 3 min
Views 4.6K
image
Опубликовав пост Новые возможности векторизации и распараллеливания в Intel® Parallel Composer, я решил сам пройти весь путь, который предлагал в комментарии. А именно получить доступ к Intel® Parallel Composer для тестирования одной из фич (англ. feature). Так как я уже занимался портированием последовательного кода на CEAN + Cilk, я остановился на тестировании Guided Auto-parallelization(GAP). Первое предложение в документации по GAP “Guided auto-parallelization is a diagnostic tool to help you locate portions in your serial code that can be parallelized.” натолкнуло меня на мысль, что я что-то подобное уже знаю у компилятора. А именно, ключи диагностики авто-векторизации и авто-распараллеливания –vec-report и –par-report. В чем же отличия читайте под катом.
Сразу оговорюсь, пользовался я только тем, что доступно при бета тестированием, никакой внутренней информацией я не пользовался. Я взял пример из презентации и с ним игрался. Первым делом проверил на авто-векторизацию:
#icl -c gaptestcase.cpp /Qvec-report3

gaptestcase.cpp(19) (col. 1): remark: routine skipped: no vectorization candidates.

Далее, хоть и не очень хорошо отношусь к авто-распараллеливанию (предпочитаю распараллеливать сам), проверил и как хорошо код авто-распараллеливается:
#icl -c gaptestcase.cpp /Qparallel /Qpar-report3
Мне это ничего не дало. После этого, решил обратиться к GAP документации. Оказалось, что существую три типа опций компилятора:
  • Активация диагностики для векторизации, распараллеливания и преобразование данных (англ. data transformations) или все вместе: –guide-vec, –guide-par, и –guide-data-trans ( Linux* OS), или /Qguide-vec, /Qguide-par, и /Qguide-data-trans (Windows* OS) или –guide[=n] (Linux* OS) или /Qguide[:n] (Windows*).
  • Выделение конкретных участков кода для диагностики (e.g. наиболее часто используемые участки кода (англ. hotspots)): -guide-opts=<arg.>. E.g. /Qguide-opts:«bar.f90,'module_1::routine_name`»
  • Перенаправление вывода: -guide-file=<file_name> -guide-file-append[=file_name]. По умолчанию все выводиться в stderr, но можно перенаправить в файл или дописать в файл.

Далее, следую словам Майка Науменко:
Сначала маленький экскурс в историю
А к практике мы перейдем потом (опосля, значит)
”,
перешел к практике. Для начала проверил, что говорит GAP об авто-векторизации примера:
image
#icl -c gaptestcase.cpp /Qguide-vec
Вывод на экран:
GAP REPORT LOG OPENED ON Sat Jul 10 17:39:54 2010
remark #30761: Add -Qparallel option if you want the compiler to generate recommendations for improving auto-parallelization.
Recompile with -guide (Linux) or -Qguide (Windows) in both passes of IPO.
…\gaptestcase.cpp(27): remark #30534: (LOOP) Add -Qansi-alias option for better type-based disambiguation analysis by the compiler if appropriate (option will apply for entire compilation). This will improve optimizations for the loop at line 27 [VERIFY] Make sure that the semantics of this option is obeyed for entire compilation.
…\gaptestcase.cpp(27): remark #30513: (VECT) Use "#pragma ivdep" to vectorize the loop at line 27, if these arrays in the loop do not have unsafe cross-iteration dependencies: ?nodes@@3PAPAUTEST_STRUCT@@A, ?distances@@3PAMA. [VERIFY] A cross-iteration dependence exists if a memory location is modified in an iteration of a loop and accessed (a read or write) in another iteration of a loop. Make sure that there are no such dependencies, or that any cross-iteration dependencies can be safely ignored.
Number of advice-messages emitted for this compilation session: 2.
END OF GAP REPORT LOG



Советы дельные. После добавления директивы #pragma ivdep в код и опции компиляции /Qansi-alias:
#icl -c gaptestcase.cpp /Qvec-report3 /Qansi-alias
…\gaptestcase.cpp(27) (col. 3): remark: LOOP WAS VECTORIZED.

После этого проверил и на автор-распараллеливание:
#icl -c gaptestcase.cpp /Qguide-par /Qparallel /Qansi-alias
Вывод на экран:
GAP REPORT LOG OPENED ON Sat Jul 10 17:36:46 2010
…\gaptestcase.cpp(27): remark #30525: (PAR) If the trip count of the loop at line 27 is greater than 16, then use "#pragma loop count min(16)" to parallelize this loop. [VERIFY] Make sure that the loop has a minimum of 16 iterations.
Number of advice-messages emitted for this compilation session: 2.
END OF GAP REPORT LOG



Тоже все верно и работает.
Как вы видите, на этом примере GAP себя показал с хорошей стороны. А именно, дал дельные советы:
  • использовать ключ компиляции -Qansi-alias;
  • добавить директивы #pragma ivdep и #pragma loop count min(16).

Что позволило компилятору успешно авто-векторизовать и распараллелить пример.
На последок для любителей Microsoft Visual Studio 2010. GAP, как и композер интегрируется в IDE:
image

image
После чего вывод идет в стандартное окно вывода.
На этом все. Спасибо за внимание.

Пожалуйста, обратитесь к странице Уведомление об оптимизации для более подробной информации относительно производительности и оптимизации в программных продуктах компании Intel.
Tags:
Hubs:
+16
Comments 5
Comments Comments 5

Articles

Information

Website
www.intel.ru
Registered
Founded
Employees
5,001–10,000 employees
Location
США
Representative
Анастасия Казантаева