Да плевать как ты его видишь в ОС... То что ты его видишь как два проца не меняет одного факта - что в отличае от реального SMP, в HT некоторые блоки у этих якобы двух процов все-таки общие, отчего неизбежно будут возникать блокировки и прошу заметить - эти блокировки будут возникать в _других_ ситуациях, чем если бы это были два отдельных проца... Так вот - оптимизирующий компилятор обязан это учитывать, чтоб использование HT было максимально эффективным.
Супер пример :))
void main( ) {
int a[10000], b[10000], c[10000];
int i,j;
for( j=0; j<10000; j++)
for (i=0; i<10000; i++) a[i] = a[i] + b[i] * c[i];
}
icc:
real 0m0.437s
user 0m0.580s
sys 0m0.150s
gcc:
real 0m0.564s
user 0m0.560s
sys 0m0.000s
Обратите внимание на sys !
Кстати, если поменять циклы местами, т.е.:
for (i=0; i<10000; i++)
for( j=0; j<10000; j++)
a[i] = a[i] + b[i] * c[i];
то результаты совсем другие:
icc:
real 0m0.113s
user 0m0.090s
sys 0m0.000s
gcc:
real 0m0.483s
user 0m0.480s
sys 0m0.000s
Есть об чем подумать!
> Судя по вашим результатам у вас какой-нибудь Pentium III 800EB. Как там HT рУлит?:-))
Хм, ну Вы меня озадачили :)
cat /proc/cpuid:
processor : 0
vendor_id : GenuineIntel
cpu family : 15
model : 2
model name : Intel(R) Pentium(R) 4 CPU 2.60GHz
stepping : 9
cpu MHz : 2612.604
cache size : 512 KB
...
processor : 1
vendor_id : GenuineIntel
cpu family : 15
model : 2
model name : Intel(R) Pentium(R) 4 CPU 2.60GHz
stepping : 9
cpu MHz : 2612.604
...
У нас на PIII 800 такой же результат (icc 7.0, RH 7.2)! Слава Intel за хороший маркетинг в продвижении все более мощных и мощных процессоров и компиляторов для них. :)
насчет HT в числодробильне это полный fake (проверено электроникой ;))...
фокус в том что эти 2 "виртуальных проца" кормятся данными от одной шины - и в 90% случаев попытки "распараллелить" таким образом код приводят к perfomance downgrade
Во, блин, проверил у себя на Целероне, и офигел: P4: gcc (GCC) 3.2 20020903 (Red Hat Linux 8.0 3.2-7) gcc -O3 -ozg z.c time ./zg real 0m0.575s user 0m0.570s sys 0m0.000s
Celeron: gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5) gcc -O3 -ozg z.c time ./zg real 0m0.129s user 0m0.100s sys 0m0.020s
>3. и про поддержку НТ в компиляторе -- ничего в этом крамольного нет и >бросаться словами "сами поняли чё сказали" не надо. НТ это не SMP и при >распараллеливании программы компилер должен это учитывать.
Нет в Intel компиляторах (равно как и в других) модулей распараллеливания программ - там есть костылики, могущие помочь при распараллеливании вами ваших программ. Но так как они hardcoded. То лучше вообще ими не пользоваться - потерь в вычислениях (даже при массовых качках памяти) не много, а гибкость перестройки программы на другую message-passing систему срежется начисто.
2sS: да я в курсе про то что HT не для числодробилок придуман - сам интель говорить что при активном юзанье FPU HT сосет и его надо отключать... Правда он тут же добавляет что в общем случае сосет fpu и есть более прогресивные технологие, такие как mmx, sse и их-то и надо использовать...:) Это интель сказал, не я...:) А имхо так х86 по жизни отсасывает в числодробилках и у рисков... И это еще никто не поборол. :)
Тяжкий вздох. Да, наверное. Некоторое время, пока разработчики не станут сильно зависить от фич интелловского компилятора. А потом интел раздумает давать свой компайлер просто так... Или прекратит его поддержку... И что тогда?.. Снова на gcc с __открытыми__ исходниками?
" Auto-Parallelization: The Intel C++ Compiler 7.1 includes an Auto-parallelization feature for automatic threading of loops. This feature provides developers with an easy way to take advantage of parallelism to improve application performance on multiprocessor systems. This option detects parallel loops capable of being executed safely in parallel and automatically generates multithreaded code for these loops. Automatic parallelization relieves the user from having to deal with the low-level details of iteration partitioning, data sharing, thread scheduling and synchronizations. It also provides the benefit of the performance available from multiprocessor systems, and systems that support HyperThreading technology. " http://www.intel.com/software/products/compilers/clin/clinux.htm
anonymous (*) (11.11.2003 15:29:37)
Парни не краснеют - бизнес обязывает. Такая методика (с "ручной" поддержкой) еще худо-бедно работала на векторных процессорах. Про выделение инвариантов циклов - тоже лажа. Балансировки всей программы нет - поэтому говорить о крупноблочном Дейкстровском распараллеливании Intel-компиляторами тоже не имеет смысла. Насчет машинно-независимой оптимизации - издавна Portland Group компиляторы среди коммерческих наиболее продвинутые. Intel у них заказывал, например, для i860 процессоров - хорошо получилось - сам тескты компилятора смотрел. Сейчас показалось, что Intel их купил, или у них купил и за свой выдает - но нет Portland Group свои продает (сам хотел бы - начальство не спонсирует).
Когда же у менеджеров Intela (заметьте - "твидовых пиджаков", а не инженеров) спрашивали - заче им такая дезинформация - они отвечали в каком-то таком смысле "раз вы такие умные - то сидите и молчите"
И на Celerone, и на P4HT icc немного уступает gcc. Приведу результаты только с P4:
icc -O3 -oyi -parallel -par_report3 y.c
procedure: TDMA
serial loop: line 24: not a parallel candidate due to insufficent work
serial loop: line 32: not a parallel candidate due to insufficent work
procedure: main
serial loop: line 63: not a parallel candidate due to statement at line 64
serial loop: line 74: not a parallel candidate due to statement at line 74
serial loop: line 75: not a parallel candidate due to statement at line 75
serial loop: line 53
output data dependence assumed from line 54 to line 54, due to "x"
output data dependence assumed from line 54 to line 54, due to "x"
output data dependence assumed from line 54 to line 54, due to "x"
output data dependence assumed from line 54 to line 54, due to "x"
y.c(56) : (col. 2) remark: LOOP WAS AUTO-PARALLELIZED.
parallel loop: line 56
shared: {"c", "b", "a"}
private: {"i"}
first private: { }
reductions: { }
y.c(65) : (col. 4) remark: LOOP WAS AUTO-PARALLELIZED.
parallel loop: line 65
shared: {"c", "b", "a"}
private: {"i"}
first private: { }
reductions: { }
./yi
Matrix Rang 2000, N of TDMA Calls: 32000
Total Time 3.260000 sec, Rate: 9.815951 TDMA calls / sec
...
gcc -O3 -oyg y.c
./yg
Matrix Rang 2000, N of TDMA Calls: 32000
Total Time 3.120000 sec, Rate: 10.256410 TDMA calls / sec
...
AMD это тот же самый, убогий по жизни, х86. Как был он 32х разрядной надстройкой над 16ти разрядным расширением 8ми битного усовершенствоания 4х разрядного калькулятора, так и остался. А за х86-64 AMD вообще памятник поставить надо. И написать на нем "Плевать сюда"...
Чем быстрее здохнет убогий х86 во всех его проявлениях, тем всем лучше будет, однозначно...
Для справки - в числодробилках сегодня рулит PowerPC. В настоящих числодробилках, а не поделках красноглазых студентов. :)
> В настоящих числодробилках, а не поделках красноглазых студентов. :)
Так зачем же Вы сюда ходите? Я лично стал сюда ходить когда на Форуме снова появился главный "возмутитель спокойствия". :))) Прикольно после рабочего дня ;-)
Linux есть и для Power. У нас на работе - он третья Linux-платформа. Но и AIX + C for AIX мы не забываем.
По-поводу AIX и PowerPC, ловите:
IBM RS6000 model F80, два проца
./ya
Matrix Rang 2000, N of TDMA Calls: 32000
Total Time 10.370000 sec, Rate: 3.085824 TDMA calls / sec
Intel Compiler 7.1:
-------------------
> icl -O3 ya.c
...
> ya.exe
Matrix Rang 2000, N of TDMA Calls: 32000
Total Time 9.744000 sec, Rate: 3284.072250 TDMA calls / sec
...
Microsoft Visual C++ 6.0:
-------------------------
> cl -O2 ya.c
...
> ya.exe
Matrix Rang 2000, N of TDMA Calls: 32000
Total Time 10.805000 sec, Rate: 2961.591856 TDMA calls / sec
...
GCC 3.2.3 (mingw)
-----------------
> gcc -O3 ya.c
...
> ya.exe
Matrix Rang 2000, N of TDMA Calls: 32000
Total Time 10.965000 sec, Rate: 2918.376653 TDMA calls / sec
Каждый exe'шник запускал 3 раза и выбирал самый быстрый, чтобы
минимизировать эффект вмешательства системы.