Россия, Липецк, Липецкий Государственный Технический Университет, 2014 |
Опубликован: 11.10.2012 | Уровень: специалист | Доступ: платный
Лекция 1:
Компиляторы Intel. Возможности автоматической оптимизации
Межпроцедурная оптимизация
- Анализ вызываемых функций приложения.
- Оптимизация многочисленных "маленьких" функций, особенно в циклах.
- Встраивание (inlining, подстановка кода) – уменьшение накладных расходов, создание возможностей для других видов оптимизации.
- Удаление неиспользуемого кода.
- Замена виртуальных вызовов статическими.
- Замена параметра функции константой.
- Эффективный анализ зависимостей для оптимизации циклов, векторизации и распараллеливания.
- Размер бинарного файла и время компиляции увеличиваются.
Пример 5
SquareRoots.cpp
#include "time.h" #include <iostream> #include "stdlib.h" #include "conio.h" #include "math.h" using namespace std; const int N = 10000; //number of steps in grid used for numerical method const int LIM = 50000; //we want to find the sum of square roots of 1..LIM double sqrootNewton(double x); double returnHalf(double value); double multiply(double value1, double value2); int main() { time_t t1, t2; double numRes(0), trueRes(0); t1 = clock(); for (int i = 0; i < LIM; i++) { numRes += sqrootNewton(i+1); trueRes += sqrt((i+1)/1.0); } t2 = clock(); cout << "Numerical result via Newton's method is " << numRes << endl; cout << "PC arithmetical result is " << trueRes << endl; cout << "\nInitial clock ticks value is " << t1 << endl; cout << "Final clock ticks value is " << t2 << endl; cout << "Difference in clock ticks is " << difftime(t2,t1) << endl; cout << "Clock ticks per second value is " << CLOCKS_PER_SEC << endl; cout << "\nActual time of calculations is " << ((t2-t1)/CLOCKS_PER_SEC) << " sec" << endl; _getch(); return 0; } double sqrootNewton(double x) // Newtonian method applied for square root { double sq = 1.0; for (int i = 0; i < N; i++) sq = returnHalf((sq + multiply(x, 1/sq))); return sq; } double returnHalf(double value) { return value*0.5; } double multiply(double value1, double value2) { return value1*value2; }
Подготовим тест:
- icl /FeSqOd /Od SquareRoots.cpp
- icl /FeSqip /Qip SquareRoots.cpp
Сравнить результаты.
Среднее значение времени выполнения:
- SqOd . . . . . 35.69 с.
- Sqip . . . . . . 9.59 с.
Вопрос. Объясните результаты теста.