Как стать автором
Обновить

Комментарии 21

Флаг России в первой табличке сразу добавил патриотизму прочтению (:
Спасибо, очень интересный опыт.
что то не могу понять что такое Intel® Composer XE. это Intel C++ Compiler или какой то другой продукт? запутался я в интеловский маркетинговых ходах. ну и небольшая ремарка: сравнивать то конечно полезно, но за gcc не просят денег.
Composer XE == Compiler Pro v.12. Только, теперь не будет 12-й версии будет продукт под названием Intel® C++/Fortran Composer XE. В которой входят (как компоненты) Intel® C++/Fortran Compiler, Intel® TBB, IPP и MKL. Так же есть продукт Intel® Parallel Composer(не эквивалентно Intel® Composer XE), который является компонентой Intel® Parallel Studio.
спасибо за ответ. у интел отличные продкуты, жаль дороговаты :)
если Вы там близки к девелоперам, есть ли какая нибудь информация по этой проблеме:
Спасибо за проделанную работу! Полезные цифры!
Core i7, какая из моделей использовалась в тесте?
Фибоначчи — неинтересный, нерепрезентативный пример, т.к. практически нет общих данных между тасками.
Сложности с параллелизацией возникают во-многом из-за общих данных, их блуждания между кэшами и т.п.
Почему не включали оптимизацию при компиляции? Оверхед кода без оптимизации может быть совершенно разным у двух компиляторов, и возможно вы сравнили не реализации OpenMP, а оверхед от отсутстивия оптимизации.
Я ставил перед собой задачу: понять как правильно применять таски в рекурсиях. По умолчанию многие опции компилятора(в том числе и оптимизации) активны. К примеру, у Intel® Compilers –O2 и –xSSE2 для Linux. Можно и руками все заанролить. Про какую именно оптимизацию идет речь?
Вот, а в gcc по умолчанию -O0. Таким образом при использовании приведённых в статтье параметров код gcc будет заведомо медленнее кода icc.
Пересчитал, на X5560 с опциями GCC –O2 –msse2, дабы уровнять уровни оптимизации с Intel® Composer XE. Результаты следующие: 98.17 сек (1 поток), 60.66 сек (2 потока), 38.46 сек (4 потока), 23.77 сек (8 потоков) и 14.74 (16 потоков).
В результате, видно, что с GCC расчет происходит быстрее на одном потоке. Но картина относительно масштабируемости не изменилась: Для GCC 4.5.0 эффективность распараллеливания ~0.5 до тех пор, пока количество потоков не превышает количества физических ядер.
Только что запустил для n=50 на i5-750, gcc 4.4.4:

1 поток — 68.19 сек
2 потока — 42.07 сек
3 потока — 42.64 сек (!)
4 потока — 28.54 сек

Возникает вопрос: почему на 1 и на 2 потоках i5 быстрее всех представленных в топике процессоров?

Ваши бинарники запустить не смог, 404.

Я убрал ненужный task в main() и получил 37.21 сек на 3 потоках (остальные результаты равны в пределах погрешности).

Во всех случаях видно, что планировщик OpenMP в gcc вообще не использует четвертое ядро при 4 потоках.

Но, если заинлайнить fib() один раз саму в себя:
#pragma omp task shared( i1 ) untied
i1 = fib( n - 2 );
#pragma omp task shared( i2 ) untied
i2 = fib( n - 3 );
#pragma omp task shared( j1 ) untied
j1 = fib( n - 3 );
#pragma omp task shared( j2 ) untied
j2 = fib( n - 4 );
#pragma omp taskwait
return i1 + i2 + j1 + j2;


то 4 ядра используются, но коэффициент ускорения всё-равно только 3.0.
хочу сделать замер на своей машине, не понял как задать кол-во потоков.
$ export OMP_NUM_THREADS=4
$ ./fib
С 404 сейчас попытаюсь решить проблему. С какими опциями собирали исходник?
Как и у вас: -O2 -msse2.
Всю информацию брал у системы:
#cat /proc/cpuinfo
#cat /etc/issue
#top
Вот как-то так.
Ну тогда тебе осталось взять еще и power state, чтобы убедиться, что система в этот момент не спит ;)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий