Опубликован: 11.10.2012 | Доступ: свободный | Студентов: 306 / 58 | Длительность: 07:36:00
Лекция 1:

Компиляторы Intel. Возможности автоматической оптимизации

Лекция 1: 1234 || Лекция 2 >

Межпроцедурная оптимизация

/Qip (Windows), -ip (Linux)

  • Анализ вызываемых функций приложения.
  • Оптимизация многочисленных "маленьких" функций, особенно в циклах.
  • Встраивание (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 с.

Вопрос. Объясните результаты теста.

Лекция 1: 1234 || Лекция 2 >