🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.os.linux.programowanie
15 messages
15 total messages Started by Adam Majewski Sat, 29 Sep 2012 10:21
gcc i icc
#72559
Author: Adam Majewski
Date: Sat, 29 Sep 2012 10:21
26 lines
1549 bytes
Witam.

W książce :Programowanie w Linuksie. Ćwiczenia
Autorzy: Katarzyna Kuźniar, Kazimierz Lal, Tomasz Rak
Data wydania: 2012/07
http://helion.pl/ksiazki/programowanie-w-linuksie-cwiczenia-katarzyna-kuzniar-kazimierz-lal-tomasz-rak,cwplin.htm

jest porównanie czsu wykonania programu mnożącego macierze dwuwymiarowe.
Można pobrać przykładowy rozdział w pdf i tam jest ten przykład.
Dla gcc czas = 1345 ms
dla icc czas =  109 ms

Czyli program skompilowany przez icc wykonywany jest 12 razy szybciej.

Co o tym sądzicie ?

Adam

PS

Na stronie :
http://software.intel.com/en-us/intel-composer-xe/
znalazłem tylko 30-dniową wersję.

http://software.intel.com/en-us/non-commercial-software-development
tutaj darmową
Re: gcc i icc
#72547
Author: Edek Pienkowski
Date: Sat, 29 Sep 2012 13:11
29 lines
2095 bytes
Dnia Sat, 29 Sep 2012 12:21:56 +0200, Adam Majewski napisal:

> Witam.
> 
> W książce :Programowanie w Linuksie. Ćwiczenia
> Autorzy: Katarzyna Kuźniar, Kazimierz Lal, Tomasz Rak
> Data wydania: 2012/07
> http://helion.pl/ksiazki/programowanie-w-linuksie-cwiczenia-katarzyna-kuzniar-kazimierz-lal-tomasz-rak,cwplin.htm
> 
> jest porównanie czsu wykonania programu mnożącego macierze dwuwymiarowe.
> Można pobrać przykładowy rozdział w pdf i tam jest ten przykład.
> Dla gcc czas = 1345 ms
> dla icc czas =  109 ms
> 
> Czyli program skompilowany przez icc wykonywany jest 12 razy szybciej.
> 
> Co o tym sądzicie ?

Zależnie od wymiarów tablic i wersji gcc można trafić na "corner case" [1],
który icc obsługuje o niebo lepiej niż gcc. Gcc też samo nawet w tak
prostych przypadkach nie konwertuje zagnieżdżonych pętli ani do
cache-oblivious ani nawet do "tiles" - trzeba to zrobić ręcznie. Nie
sprawdzałem, czy icc samo tak przekształca kod, a to jest ważne dla
dużych macierzy.


[1] "Cache aliasing", możesz znaleźć opis w Intel Optimization Guide
-- 
Edek
Re: gcc i icc
#72560
Author: Adam Majewski
Date: Sat, 29 Sep 2012 14:52
33 lines
2262 bytes
On 29.09.2012 15:11, Edek Pienkowski wrote:
> Dnia Sat, 29 Sep 2012 12:21:56 +0200, Adam Majewski napisal:
>
>> Witam.
>>
>> W książce :Programowanie w Linuksie. Ćwiczenia
>> Autorzy: Katarzyna Kuźniar, Kazimierz Lal, Tomasz Rak
>> Data wydania: 2012/07
>> http://helion.pl/ksiazki/programowanie-w-linuksie-cwiczenia-katarzyna-kuzniar-kazimierz-lal-tomasz-rak,cwplin.htm
>>
>> jest porównanie czsu wykonania programu mnożącego macierze dwuwymiarowe.
>> Można pobrać przykładowy rozdział w pdf i tam jest ten przykład.
>> Dla gcc czas = 1345 ms
>> dla icc czas =  109 ms
>>
>> Czyli program skompilowany przez icc wykonywany jest 12 razy szybciej.
>>
>> Co o tym sądzicie ?
>
> Zależnie od wymiarów tablic i wersji gcc można trafić na "corner case" [1],
> który icc obsługuje o niebo lepiej niż gcc. Gcc też samo nawet w tak
> prostych przypadkach nie konwertuje zagnieżdżonych pętli ani do
> cache-oblivious ani nawet do "tiles" - trzeba to zrobić ręcznie. Nie
> sprawdzałem, czy icc samo tak przekształca kod, a to jest ważne dla
> dużych macierzy.
>
>
> [1] "Cache aliasing", możesz znaleźć opis w Intel Optimization Guide
>
Czy to znaczy że jest to jednostkowy przypadek a ogólnei wyniki powinny 
być porównywalne ?

Adam
Re: gcc i icc
#72556
Author: Edek Pienkowski
Date: Sat, 29 Sep 2012 16:25
38 lines
2489 bytes
Dnia Sat, 29 Sep 2012 16:52:00 +0200, Adam Majewski napisal:

> On 29.09.2012 15:11, Edek Pienkowski wrote:
>> Dnia Sat, 29 Sep 2012 12:21:56 +0200, Adam Majewski napisal:
>>
>>> Witam.
>>>
>>> W książce :Programowanie w Linuksie. Ćwiczenia
>>> Autorzy: Katarzyna Kuźniar, Kazimierz Lal, Tomasz Rak
>>> Data wydania: 2012/07
>>> http://helion.pl/ksiazki/programowanie-w-linuksie-cwiczenia-katarzyna-kuzniar-kazimierz-lal-tomasz-rak,cwplin.htm
>>>
>>> jest porównanie czsu wykonania programu mnożącego macierze dwuwymiarowe.
>>> Można pobrać przykładowy rozdział w pdf i tam jest ten przykład.
>>> Dla gcc czas = 1345 ms
>>> dla icc czas =  109 ms
>>>
>>> Czyli program skompilowany przez icc wykonywany jest 12 razy szybciej.
>>>
>>> Co o tym sądzicie ?
>>
>> Zależnie od wymiarów tablic i wersji gcc można trafić na "corner case" [1],
>> który icc obsługuje o niebo lepiej niż gcc. Gcc też samo nawet w tak
>> prostych przypadkach nie konwertuje zagnieżdżonych pętli ani do
>> cache-oblivious ani nawet do "tiles" - trzeba to zrobić ręcznie. Nie
>> sprawdzałem, czy icc samo tak przekształca kod, a to jest ważne dla
>> dużych macierzy.
>>
>>
>> [1] "Cache aliasing", możesz znaleźć opis w Intel Optimization Guide
>>
> Czy to znaczy że jest to jednostkowy przypadek a ogólnei wyniki powinny 
> być porównywalne ?

Nie rozumiem. Co jest napisane w tej książce?

-- 
Edek
Re: gcc i icc
#72555
Author: Adam Majewski
Date: Sat, 29 Sep 2012 17:22
46 lines
3011 bytes
On 29.09.2012 18:25, Edek Pienkowski wrote:
> Dnia Sat, 29 Sep 2012 16:52:00 +0200, Adam Majewski napisal:
>
>> On 29.09.2012 15:11, Edek Pienkowski wrote:
>>> Dnia Sat, 29 Sep 2012 12:21:56 +0200, Adam Majewski napisal:
>>>
>>>> Witam.
>>>>
>>>> W książce :Programowanie w Linuksie. Ćwiczenia
>>>> Autorzy: Katarzyna Kuźniar, Kazimierz Lal, Tomasz Rak
>>>> Data wydania: 2012/07
>>>> http://helion.pl/ksiazki/programowanie-w-linuksie-cwiczenia-katarzyna-kuzniar-kazimierz-lal-tomasz-rak,cwplin.htm
>>>>
>>>> jest porównanie czsu wykonania programu mnożącego macierze dwuwymiarowe.
>>>> Można pobrać przykładowy rozdział w pdf i tam jest ten przykład.
>>>> Dla gcc czas = 1345 ms
>>>> dla icc czas =  109 ms
>>>>
>>>> Czyli program skompilowany przez icc wykonywany jest 12 razy szybciej.
>>>>
>>>> Co o tym sądzicie ?
>>>
>>> Zależnie od wymiarów tablic i wersji gcc można trafić na "corner case" [1],
>>> który icc obsługuje o niebo lepiej niż gcc. Gcc też samo nawet w tak
>>> prostych przypadkach nie konwertuje zagnieżdżonych pętli ani do
>>> cache-oblivious ani nawet do "tiles" - trzeba to zrobić ręcznie. Nie
>>> sprawdzałem, czy icc samo tak przekształca kod, a to jest ważne dla
>>> dużych macierzy.
>>>
>>>
>>> [1] "Cache aliasing", możesz znaleźć opis w Intel Optimization Guide
>>>
>> Czy to znaczy że jest to jednostkowy przypadek a ogólnei wyniki powinny
>> być porównywalne ?
>
> Nie rozumiem. Co jest napisane w tej książce?
>
W książce jest : "rodzaj użytego kompilatora ma duze znaczenie."
Nie rozwijają tego.
Czy można powiedzieć że średni czas wykonywania programu po kompilacji z 
użyciem icc jest znacząco krótszy niż po użyciu gcc ? ( na procesorach 
intela )

Adam

Adam
Re: gcc i icc
#72553
Author: Edek Pienkowski
Date: Sat, 29 Sep 2012 18:15
51 lines
3471 bytes
Dnia Sat, 29 Sep 2012 19:22:31 +0200, Adam Majewski napisal:

> On 29.09.2012 18:25, Edek Pienkowski wrote:
>> Dnia Sat, 29 Sep 2012 16:52:00 +0200, Adam Majewski napisal:
>>
>>> On 29.09.2012 15:11, Edek Pienkowski wrote:
>>>> Dnia Sat, 29 Sep 2012 12:21:56 +0200, Adam Majewski napisal:
>>>>
>>>>> Witam.
>>>>>
>>>>> W książce :Programowanie w Linuksie. Ćwiczenia
>>>>> Autorzy: Katarzyna Kuźniar, Kazimierz Lal, Tomasz Rak
>>>>> Data wydania: 2012/07
>>>>> http://helion.pl/ksiazki/programowanie-w-linuksie-cwiczenia-katarzyna-kuzniar-kazimierz-lal-tomasz-rak,cwplin.htm
>>>>>
>>>>> jest porównanie czsu wykonania programu mnożącego macierze dwuwymiarowe.
>>>>> Można pobrać przykładowy rozdział w pdf i tam jest ten przykład.
>>>>> Dla gcc czas = 1345 ms
>>>>> dla icc czas =  109 ms
[...]
>>> Czy to znaczy że jest to jednostkowy przypadek a ogólnei wyniki powinny
>>> być porównywalne ?
>>
>> Nie rozumiem. Co jest napisane w tej książce?
>>
> W książce jest : "rodzaj użytego kompilatora ma duze znaczenie."
> Nie rozwijają tego.
> Czy można powiedzieć że średni czas wykonywania programu po kompilacji z 
> użyciem icc jest znacząco krótszy niż po użyciu gcc ? ( na procesorach 
> intela )

Kompilator Intela stosowany do kodu na Intele (nie AMD) prawdopodobnie
jest faktycznie najlepszy - musiałbyś poszukać benchmarków (SPEC lub inne).
Średnio, cokolwiek to znaczy, może być z 1% czy może 3% lepszy od gcc.
Zazwyczaj nie ma to większego...

Jeżeli masz konkretny kod, gdzie w optymalizację wkłada się b.dużo 
wysiłku różnice mogą być większe, tak około 10% i lepiej, ale to nigdy nie 
wiadomo w którą stronę i trzeba porównywać konkretne wersje kompilatorów
i wiedzieć, jakich opcji się używa, i na jakim procesorze się 
to uruchamia, głównie pod względem zestawu instrukcji. Większość
linuksów używa zestawu instrukcji najniższego wspólnego mianownika -
poza wyspecjalizowanym kodem, czyli multimediami, memcpy itp.

No i są takie skrajne przykłady, tylko że jeden skrajny przykład nic 
nie znaczy, trzeba mieć wiedzę o dużej ich liczbie, bo nie będą wszystkie
w tę samą stronę. Twórcy kompilatorów liczą każdy procent, ale przyjmują
10% jako zmianę jakościową - inaczej użyszkodnik nie zauważy.

-- 
Edek
Re: gcc i icc
#72562
Author: Krzysztof Halasa
Date: Sat, 29 Sep 2012 19:30
74 lines
3248 bytes
Adam Majewski <adammaj1@o2.pl> writes:

> W książce :Programowanie w Linuksie. Ćwiczenia
> Autorzy: Katarzyna Kuźniar, Kazimierz Lal, Tomasz Rak
> Data wydania: 2012/07
> http://helion.pl/ksiazki/programowanie-w-linuksie-cwiczenia-katarzyna-kuzniar-kazimierz-lal-tomasz-rak,cwplin.htm
>
> jest porównanie czsu wykonania programu mnożącego macierze dwuwymiarowe.
> Można pobrać przykładowy rozdział w pdf i tam jest ten przykład.
> Dla gcc czas = 1345 ms
> dla icc czas =  109 ms
>
> Czyli program skompilowany przez icc wykonywany jest 12 razy szybciej.
>
> Co o tym sądzicie ?

Łatwo sprawdzić. Nie mam niestety maszynki z Phenomem II N620 + 4 GB
RAM, najbardziej zbliżona ma nieco wolniejszy zegar i 2 GB RAM:

model name      : AMD Athlon(tm) II X2 245 Processor
cpu MHz         : 2200.000
cache size      : 1024 KB
cpu cores       : 2

Tamten ich Phenom jest podobny:
model name	: AMD Phenom(tm) II N620 Dual-Core Processor
cpu MHz		: 2800.000
cache size	: 1024 KB
cpu cores	: 2


$ gcc -W -Wall test.c -o test
test.c: In function ‘main’:
test.c:57:2: warning: implicit declaration of function ‘gettimeofday’ [-Wimplicit-function-declaration]

$ ./test 500 500 500
arg[0] = 500
arg[1] = 500
arg[2] = 500
Start
Czas: 1375 milisekund

No rzeczywiście... tyle że tak jest bez optymalizacji.

W normalnych warunkach:
$ gcc -O2 -W -Wall test.c -o test
$ ./test 500 500 500
Czas: 251 milisekund
...
Czas: 340 milisekund

Swoją drogą, spore różnice - maszynka jest w tej chwili nieco obciążona,
pewnie dlatego. Trzeba będzie się temu przyjrzeć w wolnej chwili.

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
28071 named     20   0  249m  39m 2948 S 160.7  2.3   5612:36 named


Gcc 4.7.2, 64 bity. Kod 32-bitowy:
Czas: 519 milisekund
Czas: 566 milisekund
Czas: 513 milisekund

Owszem, widać wyraźnie różnicę między tymi wynikami (w najlepszym
przypadku czas gcc to 251 ms / 2800 * 2200 (różnice w zegarach CPU) =
ok. 197 ms), ale bez przesady. Nie miałem okazji przetestować z ICC,
przypuszczalnie mają tam lepszy optymalizator potrafiący przerobić
takie coś na SSE.

Złośliwie zauważę, że oni chyba pomylili program pokazujący różnice
między kompilatorami z przykładem "jak nie powinien wyglądać program
w C", zarówno jeśli chodzi o treść jak i o algorytm :-)
-- 
Krzysztof Halasa
Re: gcc i icc
#72561
Author: bartek szurgot
Date: Wed, 03 Oct 2012 18:06
18 lines
1704 bytes
On 09/29/2012 12:21 PM, Adam Majewski wrote:
> jest porównanie czsu wykonania programu mnożącego macierze dwuwymiarowe.
> Można pobrać przykładowy rozdział w pdf i tam jest ten przykład.
> Dla gcc czas = 1345 ms
> dla icc czas =  109 ms

ogólna zasada mówi - najpierw zmierz a potem zdecyduj. różne kompilatory
mają różne właściwości, różne optymalizacje...

w tym konkretnym przypadku ICC wypada lepiej, ponieważ automatycznie
wykrywa typową konstrukcję mnożenia macierzy i używa dedykowanych
instrukcji procesora, w miejsce "ręcznych pętli". GCC tego nie robi. też
się kiedyś natknąłem na ten konkretny przypadek.

-- 
pozdrawiam serdecznie / best regards,
bartek szurgot
/* http://www.baszerr.eu */
Re: gcc i icc
#72558
Author: Edek Pienkowski
Date: Wed, 03 Oct 2012 22:51
16 lines
1525 bytes
Dnia Sat, 29 Sep 2012 12:21:56 +0200, Adam Majewski napisal:

> W książce rogramowanie w Linuksie. Ćwiczenia
> Autorzy: Katarzyna Kuźniar, Kazimierz Lal, Tomasz Rak

Trochę OT, ale mam niejasne przeczucie, że kiedyś książki
na te tematy pisali znani specjaliści, a dzisiaj niektórzy 
wykładowcy przepisują wybrakłe skrypty do książek dodając
od siebie parę błędów.

Sam przynajmniej się naciąłem kupując dwie książki na jeden
temat, po czym się okazało, że ktoś z kogoś zrobił plagiat,
prawdopodobnie autorzy obu z trzeciej. True story.

-- 
Edek
Re: gcc i icc
#72564
Author: Baranosiu
Date: Mon, 08 Oct 2012 13:38
54 lines
2439 bytes
Dnia 29.09.2012 Adam Majewski <adammaj1@o2.pl> napisał/a:
> Można pobrać przykładowy rozdział w pdf i tam jest ten przykład.
> Dla gcc czas = 1345 ms
> dla icc czas =  109 ms
>
> Czyli program skompilowany przez icc wykonywany jest 12 razy szybciej.
>
> Co o tym sądzicie ?

Kompilator Intela testowany na procesorze AMD :D
Nie mam procesora AMD, ale ustawienia kompilatora GCC
dużo zmieniają :D
Przykład ode mnie (wersja bez OpenMP) na procesorze Intel Q9550
(Core 2 Quad, 2.83GHz, 8G RAM, Debian 32-bitowy z kernelem 2.6.32)

$ gcc --version
gcc (Debian 4.4.5-8) 4.4.5

$ gcc tablice.c -o tablice
$ ./tablice 500 500 500
arg[0] = 500
arg[1] = 500
arg[2] = 500
Start
Czas: 1158 milisekund

$ gcc -O3 tablice.c -o tablice
$ ./tablice 500 500 500
arg[0] = 500
arg[1] = 500
arg[2] = 500
Start
Czas: 350 milisekund

Jedna opcja dodana do kompilatora wiele zmienia, pewnie jakbym
potuningował dokładniej, to dałoby się uzyskać coś więcej.
Dodatkowo widać, że autor programu się nie popisał znajomością
działania pamięci i sposobu w jaki kompilator C zamienia "wskaźnik
do wskaźnika" na odwołanie do tablicy dwuwymiarowej. Wystarczy
macierz 'b' trzymać w pamięci w postaci transponowanej a wtedy
w samym mnożeniu można zamienić kolejność indeksów, linia 59
będzie wtedy wyglądała tak (zamienione indeksy przy b[][]):
c[i][j] += a[i][k]*b[j][k];
i dostajemy:

$ gcc -O3 tablice.c -o tablice
$ ./tablice 500 500 500
arg[0] = 500
arg[1] = 500
arg[2] = 500
Start
Czas: 274 milisekund

Żaden kompilator nie zastąpi myślenia :D
Re: gcc i icc
#72563
Author: Baranosiu
Date: Mon, 08 Oct 2012 13:54
83 lines
3228 bytes
Dnia 08.10.2012 Baranosiu <rad_n@wp.pl> napisał/a:
> Dnia 29.09.2012 Adam Majewski <adammaj1@o2.pl> napisał/a:
>> Można pobrać przykładowy rozdział w pdf i tam jest ten przykład.
>> Dla gcc czas = 1345 ms
>> dla icc czas =  109 ms
>>
>> Czyli program skompilowany przez icc wykonywany jest 12 razy szybciej.
>>
>> Co o tym sądzicie ?
>
> Kompilator Intela testowany na procesorze AMD :D
> Nie mam procesora AMD, ale ustawienia kompilatora GCC
> dużo zmieniają :D
> Przykład ode mnie (wersja bez OpenMP) na procesorze Intel Q9550
> (Core 2 Quad, 2.83GHz, 8G RAM, Debian 32-bitowy z kernelem 2.6.32)
>
> $ gcc --version
> gcc (Debian 4.4.5-8) 4.4.5
>
> $ gcc tablice.c -o tablice
> $ ./tablice 500 500 500
> arg[0] = 500
> arg[1] = 500
> arg[2] = 500
> Start
> Czas: 1158 milisekund
>
> $ gcc -O3 tablice.c -o tablice
> $ ./tablice 500 500 500
> arg[0] = 500
> arg[1] = 500
> arg[2] = 500
> Start
> Czas: 350 milisekund
>
> Jedna opcja dodana do kompilatora wiele zmienia, pewnie jakbym
> potuningował dokładniej, to dałoby się uzyskać coś więcej.
> Dodatkowo widać, że autor programu się nie popisał znajomością
> działania pamięci i sposobu w jaki kompilator C zamienia "wskaźnik
> do wskaźnika" na odwołanie do tablicy dwuwymiarowej. Wystarczy
> macierz 'b' trzymać w pamięci w postaci transponowanej a wtedy
> w samym mnożeniu można zamienić kolejność indeksów, linia 59
> będzie wtedy wyglądała tak (zamienione indeksy przy b[][]):
> c[i][j] += a[i][k]*b[j][k];
> i dostajemy:
>
> $ gcc -O3 tablice.c -o tablice
> $ ./tablice 500 500 500
> arg[0] = 500
> arg[1] = 500
> arg[2] = 500
> Start
> Czas: 274 milisekund
>
> Żaden kompilator nie zastąpi myślenia :D

I jeszcze jedna szybka poprawka, jeśli zamienimy w tej linii
59 odwołanie c[i][j] na zmienną tymczasową, to wtedy fragment
mnożenia (linie 56-62) wyglądają tak:

 int tym;
 for(i=0;i<w[0];i++){
   for(j=0;j<w[2];j++) {
     tym=0;
     for(k=0;k<w[1];k++) {
       tym += a[i][k]*b[j][k];
     }
     c[i][j]=tym;
   }
 }

Dokładając do tego wsparcie SSE4.1 (które akurat w moim procku jest)
dostajemy:

$ gcc -O3 -msse4.1 tablice.c -o tablice
$ ./tablice 500 500 500
arg[0] = 500
arg[1] = 500
arg[2] = 500
Start
Czas: 63 milisekund

Dalej już nie będę kombinował :D
Re: gcc i icc
#72565
Author: orcus
Date: Mon, 08 Oct 2012 16:59
23 lines
1827 bytes
On 2012-10-08, Baranosiu <rad_n@wp.pl> wrote:
> Żaden kompilator nie zastąpi myślenia :D

Przy sporze o to który samochód może pojechać szybciej
z 4 osobami i bagażami w środku też można powiedzieć, że
mój - przecież bez tych 4 osób jest najszybszy...


Wracając do tematu - jako sysadmin widzę jak sobie radzą koledzy 
opiekujący się aplikacjami. Jest to zwykle soft do obliczeń naukowych.
Czasem napisany z mocnymi optymalizacjami a czasem tak, że pierwszy
lepszy student informatyki napisałby lepszy kod. Całość to głównie C/C++
ze sporą ilością Fortrana.

O ile jeszcze 2-3 lata temu chłopakom udawało się wyciągnąć 10-20%
używając icc to w tej chwili gcc i icc idą łeb w łeb z lekkim przechyłem
w stronę gcc. To się ładnie koreluje z faktem, że 2-3 lata temu
kupiliśmy nowe procesory intela. Pewnie jakbyśmy teraz kupili coś
świeżego na rynku to znowu icc "dostałoby kopa".

-- 
Pozdrawiam
orcus
Re: gcc i icc
#72566
Author: Baranosiu
Date: Mon, 08 Oct 2012 17:37
31 lines
2795 bytes
Dnia 08.10.2012 orcus@pwr.wroc.pl <orcus@pwr.wroc.pl> napisał/a:
> On 2012-10-08, Baranosiu <rad_n@wp.pl> wrote:
>> Żaden kompilator nie zastąpi myślenia :D
>
> Przy sporze o to który samochód może pojechać szybciej
> z 4 osobami i bagażami w środku też można powiedzieć, że
> mój - przecież bez tych 4 osób jest najszybszy...

Samochód może i jest nieco szybszy, ale to w jakim czasie pokonasz
trasę od punktu A do pnktu B zależy też od kierowcy :D

Co do mojego posta: od kilku lat nie używam icc i nie wiem jak on się
ma teraz do gcc, ale nigdy różnica nie była aż 12-krotna :D Autorzy
chyba "na szybko" pisali ten kod w książce (swoją drogą ja bym się
nawet wstydził opublikowac kod z takim formatowaniem :D) i trafił się
przypadek, w którym wyjątkowo icc sobie poradził kilkunastokrotnie
lepiej, więc odpisałem autorowi pytania, że "diabeł" tkwi w samym
indeksowaniu. Gdyby to były tablice zadeklarowane jako c[500][500] i
b[500][500] to szło by jak burza bo wyliczenie adresu elementu jest
proste, a skoro tablice są zadeklarowane jako **b i **c i potem
"ręcznie" są alokowane miejsca dla każdego wiersza z osobna, to te
wiersze nie muszą leżeć w pamięci "jeden za drugim", więc wyliczenie
adresu elementu przestaje być prostym mnożeniem i dodawaniem, tylko
trzeba "pobiegać" po pamięci. GCC akurat jest tak napisany, że
optymalizator lepiej sobie radzi, jeśli wewnątrz pętli zmienia się
ostatni indeks, bo wtedy nie trzeba za każdym razem wyliczać początku
wiersza (choć mógłby też zauważyć, że wyrażenie c[i][j] wewnątrz
najbardziej zagnieżdżonej pętli wskazuje zawsze na ten sam element i
nie trzeba go za każdym razem wyliczać, ale jak się okazuje, przy
niewielkim nakładzie pracy można "nieznacznie" pomóc kompilatorowi i
przyspieszyć kod nawet kilkunastokrotnie :D).
Re: gcc i icc
#72567
Author: Edek Pienkowski
Date: Mon, 08 Oct 2012 17:37
23 lines
2102 bytes
Dnia Mon, 08 Oct 2012 16:59:51 +0000, orcus napisal:

> Wracając do tematu - jako sysadmin widzę jak sobie radzą koledzy
> opiekujący się aplikacjami. Jest to zwykle soft do obliczeń naukowych.
> Czasem napisany z mocnymi optymalizacjami a czasem tak, że pierwszy lepszy
> student informatyki napisałby lepszy kod. Całość to głównie C/C++
> ze sporą ilością Fortrana.

Część studentów _po_ informatyce to nie wiedziałaby, że jest taki nowy
samochód na rynku co nazywa się Fortran.

> O ile jeszcze 2-3 lata temu chłopakom udawało się wyciągnąć 10-20%
> używając icc to w tej chwili gcc i icc idą łeb w łeb z lekkim przechyłem w
> stronę gcc. To się ładnie koreluje z faktem, że 2-3 lata temu kupiliśmy
> nowe procesory intela. Pewnie jakbyśmy teraz kupili coś świeżego na rynku
> to znowu icc "dostałoby kopa".

Gcc dostaje info i od AMD i od Intela, AMD to miało nawet zaimplementowane 
przyszłe procesory w jednej z wersji gcc. Co nie znaczy, że icc na nowych
by nie było lepsze.

-- 
Edek
Re: gcc i icc
#72568
Author: Adam Majewski
Date: Wed, 21 Nov 2012 16:30
1 lines
1098 bytes
http://www.phoronix.com/scan.php?page=article&item=linux_compiler_deathmatch&num=1
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads