Intel vs VC++
От: Аноним  
Дата: 01.02.11 13:26
Оценка:
Привет всем !

Неоднократно слышал мнение, что интеловский компилятор C++ — самый быстрый среди своих сородичей.
Поскольку сам я пользуюсь VC++, эта тема меня давно интересовала.
Недавно удалось вплотную поработать с данным инструментом, однако результаты немного разочаровали.

Вводные данные:
Visual Studio 2008, встроенный компилятор VC++ против Intel Compiler C++ (версия 11.1).
Компьютер средненький — Intel Core 2 Duo E6600, 2 GB RAM, Windows XP.

Дал обоим испытуемым "погрызть орешков" — вычисление CRC32 (Boost), шифрование Blowfish-ем,
обработка битмапов (работа с альфа-каналом). Все тесты запускал по нескольку раз подряд,
жесткий диск и прочие отвлекающие факторы в коде не использовались.
Время замерял с помощью GetTickCount и QueryPerformanceCounter.
В общем, VC++ во всех тестах немного впереди, процентов на 5-10%.

Полистав обширные интеловские доки, у меня создалось впечатление, что где-то можно было
"довернуть гайки", хотя и Profile-Guided Optimization, и всякие Loop Unrolling я, понятное дело,
тоже пробовал юзать (эффекта не дало).

Должны же в интеловских потайных лабораториях знать какой-то секрет дополнительных 10-15
процентов производительности !


В связи с этим у меня 2 вопроса:
1 — кто-нибудь применяет этот компилятор в работе ?
2 — на каких, все-таки, тестах интеловский компилятор обгонит VC++ (если это вообще возможно) ?
Re: Intel vs VC++
От: CreatorCray  
Дата: 01.02.11 14:01
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>1 — кто-нибудь применяет этот компилятор в работе ?

Я применяю.

А>2 — на каких, все-таки, тестах интеловский компилятор обгонит VC++ (если это вообще возможно) ?

Ещё до того как в ICC появился С++0х обгонял во всём.
После появления С++0х 2008я проект уже не скопилирует.
Попробуй /QxHost ключ выставить.
Выложи куда нить архив с полными сурсами (всё что нужно для сборки на 2008й, ничего больше не установлено) — посмотрим что там к чему.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Intel vs VC++
От: CreatorCray  
Дата: 01.02.11 14:59
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Дал обоим испытуемым "погрызть орешков" — вычисление CRC32 (Boost),


Интересу ради слепил тест.
ICC 12.0 /QxHost vs VC2008 SP1 /arch:SSE2

CRC32 не из буста.

ICC:

MD5... Full:Done Parts:Done Time: 6'598'056 (0.002151) 464.79 Mb/s
SHA1... Full:Done Parts:Done Time: 8'158'261 (0.002660) 375.91 Mb/s
SHA256... Full:Done Parts:Done Time: 21'160'357 (0.006900) 144.93 Mb/s
CRC32... Full:Done Parts:Done Time: 7'687'209 (0.002507) 398.94 Mb/s


VC:

MD5... Full:Done Parts:Done Time: 7'081'010 (0.002309) 433.10 Mb/s
SHA1... Full:Done Parts:Done Time: 11'698'663 (0.003815) 262.15 Mb/s
SHA256... Full:Done Parts:Done Time: 24'407'834 (0.007959) 125.65 Mb/s
CRC32... Full:Done Parts:Done Time: 8'031'071 (0.002619) 381.87 Mb/s


А>шифрование Blowfish-ем,

Blowfish нету, есть Twofish.

ICC:

AES:
No chaining
-----------------------------------------------
key 128 bits
SetKey: ( 0.000000) 897
Encode: ( 0.112526) 345'088'205 142.189894 Mb/s
Decode: ( 0.112312) 344'434'430 142.459786 Mb/s

TwoFish:
No chaining
-----------------------------------------------
key 128 bits
SetKey: ( 0.000002) 7'303
Encode: ( 0.122095) 374'439'080 131.045298 Mb/s
Decode: ( 0.117257) 359'602'551 136.451982 Mb/s


VC:

AES:
No chaining
-----------------------------------------------
key 128 bits
SetKey: ( 0.000001) 2'530
Encode: ( 0.125341) 384'390'904 127.652129 Mb/s
Decode: ( 0.132387) 405'999'305 120.858131 Mb/s

TwoFish:
No chaining
-----------------------------------------------
key 128 bits
SetKey: ( 0.000029) 89'148
Encode: ( 0.137263) 420'954'756 116.564775 Mb/s
Decode: ( 0.144893) 444'355'925 110.426111 Mb/s


Кода для картинок с альфой у меня нету.

Таки не знаю шо у вас не так.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Intel vs VC++
От: Алексей.  
Дата: 01.02.11 19:13
Оценка:
А если сравнить с VS2010?
Re[3]: Intel vs VC++
От: CreatorCray  
Дата: 01.02.11 19:16
Оценка:
Здравствуйте, Алексей., Вы писали:

А>А если сравнить с VS2010?

Нету
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Intel vs VC++
От: Аноним  
Дата: 03.02.11 08:15
Оценка:
Здравствуйте, CreatorCray.

Провел еще несколько самописных тестов — на использование контейнеров STL (set, vector, list),
а также на оптимизацию работы с циклами, массивами и вызовами функций/виртуальных методов.
Ради интереса перекомпилировал пару своих программ, работа которых опирается на перфоманс, и
сравнил результаты.

Общее впечатление в целом не изменилось.
Компилятор от Intel кое-где показывает лучшую производительность (порядка 5%), но выигрыш
этот достигается путем тщательнейшего профилирования, анализов и экспериментов с флажками оптимизации.
То же самое, в принципе, можно было проделывать и с VC++.

Один из тестов, для примера:

  Скрытый текст
#include "target_version.h"
#include "platform.h"
#include <Windows.h>
#include <iostream>
#include <vector>
#include <list>
#include <set>

int
PLATFORM_CDECL
main()
{
using namespace std;

LARGE_INTEGER TimeBefore;
LARGE_INTEGER TimeAfter;

vector<int> Vec;
list<int> List;
set<int> Set;

const ptrdiff_t Limit = 10000000;
int Sum = 0;

    QueryPerformanceCounter(&TimeBefore);

    for (ptrdiff_t i = 0; i < Limit; ++i)
    {
        Vec.push_back(rand());
        List.push_back(rand());
        Set.insert(rand());
    }

    for (vector<int>::iterator it = Vec.begin();
        it != Vec.end();
        ++it)
    {
        Sum += *it;
    }    

    for (list<int>::iterator it = List.begin();
        it != List.end();
        ++it)
    {
        Sum += *it;
    }

    for (set<int>::iterator it = Set.begin();
        it != Set.end();
        ++it)
    {
        Sum += *it;
    }

    QueryPerformanceCounter(&TimeAfter);

    cout <<
        "Sum:  " << Sum << "\n" <<
        "Time: " << TimeAfter.QuadPart - TimeBefore.QuadPart << "\n";

    return 0;
}


Время выполнения, результаты (среднее арифметическое по результатам 3 запусков):

VC++ (/O2, /Ob2, /Qt, Runtime-проверки отключены, остальное по умолчанию)
38788544

Intel (/O3, /Ob2, /Ot, /QxHost, Runtime-проверки отключены, остальное по умолчанию)
40926662


Уверенно победить VC++ (+12%) удалось только однажды, и только за счет векторизации, PGO,
разворачивания циклов + установки fastcall на вызовы функций.
При этом с VC++ я особо не возился, просто выставил Maximize Speed + Inlining.
То есть, теоретически, отрыва могло и не быть.

Собственно, ощущение такое, что VC++ уже "из коробки" (без всяких особых флагов) генерит достаточно
оптимизированный код, а ICL для такого же результата нужно еще затачивать (и с пониманием того что делаешь)
.
Хотя возможностей "заточки", несомненно, больше.
Отсутствие опыта работы именно с Intel C++ Compiler тоже сказалось, не отрицаю.

И отмечу, что "жадная" векторизация всего, что под руку попадается, как и вообще применение
Intel-specific средств оптимизации, рассчитанных на конкретные процессорные особенности и наборы
команд типа SSE4, мне по ряду причин не подходят (не у всех моих клиентов поддерживаются SSE2 !).

Сама среда понравилась, особенно Code Coverage Tool — я бы его для юнит-тестов с большим толком пристроил !
Re[3]: Intel vs VC++
От: Murom Россия  
Дата: 03.02.11 11:34
Оценка: +2
Здравствуйте, Аноним, Вы писали:

А>Один из тестов, для примера:


А>[cut]

А>
А>#include "target_version.h"
А>#include "platform.h"
А>#include <Windows.h>
А>#include <iostream>
А>#include <vector>
А>#include <list>
А>#include <set>

А>int
А>PLATFORM_CDECL
А>main()
А>{
А>using namespace std;

А>LARGE_INTEGER TimeBefore;
А>LARGE_INTEGER TimeAfter;

А>vector<int> Vec;
А>list<int> List;
А>set<int> Set;

А>const ptrdiff_t Limit = 10000000;
А>int Sum = 0;

А>    QueryPerformanceCounter(&TimeBefore);

А>    for (ptrdiff_t i = 0; i < Limit; ++i)
А>    {
А>        Vec.push_back(rand());
А>        List.push_back(rand());
А>        Set.insert(rand());
А>    }

А>    for (vector<int>::iterator it = Vec.begin();
А>        it != Vec.end();
А>        ++it)
А>    {
А>        Sum += *it;
А>    }    

А>    for (list<int>::iterator it = List.begin();
А>        it != List.end();
А>        ++it)
А>    {
А>        Sum += *it;
А>    }

А>    for (set<int>::iterator it = Set.begin();
А>        it != Set.end();
А>        ++it)
А>    {
А>        Sum += *it;
А>    }

А>    QueryPerformanceCounter(&TimeAfter);

А>    cout <<
А>        "Sum:  " << Sum << "\n" <<
А>        "Time: " << TimeAfter.QuadPart - TimeBefore.QuadPart << "\n";

А>    return 0;
А>}
А>


А есть понимание что меряется?
Вставки в массивы, списки и т.д. по сути своей это аллоцирование памяти (суть вызовы внешних функций а-ля маллоки всякие), подсчет суммы тоже не сильно наоптимизируешь.
Где тут оптимизатору разгуляться?

Вы возмите что-нибудь из математики, где много рассчетов с минимумом обращений к рантайму, т.е. вызову внешних функций.
Что-нибудь позабористее такое.
И включите интеловский оптимизатор на полную.
Тогда и видны будут результаты.

Вообще интеловский компилятор можно использовать для "рядовых" (нематематических) решений, только не надо оно никому. Его назначение другое — оптимизировать код под конкретную железку, на которой будут гоняться вычисления.

Приходилось с ним работать и работать плотно.
Так вот стандартный сценарий был такой — пишется код, используя МС-компилятор, ищутся алгоритмические ошибки.
Потом берется рабочий код, компилируется на конкретном железе, и там гоняется сутками/неделями.
Вот тут отдача от интеловского компилятора максимальная.

Вообще инструмент достуточно узко-специализированный. Поэтому если вам надо в stl-ные контейнеры элементы вставлять/удалять, то вам и компилятор от интела не нужен. Просто не для вашей он задачи.
- Eugeny
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.