Неоднократно слышал мнение, что интеловский компилятор 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++ (если это вообще возможно) ?
Здравствуйте, <Аноним>, Вы писали:
А>1 — кто-нибудь применяет этот компилятор в работе ?
Я применяю.
А>2 — на каких, все-таки, тестах интеловский компилятор обгонит VC++ (если это вообще возможно) ?
Ещё до того как в ICC появился С++0х обгонял во всём.
После появления С++0х 2008я проект уже не скопилирует.
Попробуй /QxHost ключ выставить.
Выложи куда нить архив с полными сурсами (всё что нужно для сборки на 2008й, ничего больше не установлено) — посмотрим что там к чему.
Здравствуйте, Алексей., Вы писали:
А>А если сравнить с 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
Уверенно победить VC++ (+12%) удалось только однажды, и только за счет векторизации, PGO,
разворачивания циклов + установки fastcall на вызовы функций.
При этом с VC++ я особо не возился, просто выставил Maximize Speed + Inlining.
То есть, теоретически, отрыва могло и не быть.
Собственно, ощущение такое, что VC++ уже "из коробки" (без всяких особых флагов) генерит достаточно
оптимизированный код, а ICL для такого же результата нужно еще затачивать (и с пониманием того что делаешь).
Хотя возможностей "заточки", несомненно, больше.
Отсутствие опыта работы именно с Intel C++ Compiler тоже сказалось, не отрицаю.
И отмечу, что "жадная" векторизация всего, что под руку попадается, как и вообще применение
Intel-specific средств оптимизации, рассчитанных на конкретные процессорные особенности и наборы
команд типа SSE4, мне по ряду причин не подходят (не у всех моих клиентов поддерживаются SSE2 !).
Сама среда понравилась, особенно Code Coverage Tool — я бы его для юнит-тестов с большим толком пристроил !
Здравствуйте, Аноним, Вы писали:
А>Один из тестов, для примера:
А>[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-ные контейнеры элементы вставлять/удалять, то вам и компилятор от интела не нужен. Просто не для вашей он задачи.