🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.os.linux.programowanie
Article #72563

Re: gcc i icc

#72563
From: 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
Technical Details
Message-ID: <k4ulv9$imc$1@news.task.gda.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!news.task.gda.pl!not-for-mail
References: <k46i43$pte$1@news.dialog.net.pl> <k4ul0s$glj$1@news.task.gda.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!news.task.gda.pl!not-for-mail
From: Baranosiu <rad_n@wp.pl>
Newsgroups: pl.comp.os.linux.programowanie
Subject: Re: gcc i icc
Date: Mon, 8 Oct 2012 13:54:49 +0000 (UTC)
Organization: CI TASK http://www.task.gda.pl/
Lines: 83
Message-ID: <k4ulv9$imc$1@news.task.gda.pl>
References: <k46i43$pte$1@news.dialog.net.pl> <k4ul0s$glj$1@news.task.gda.pl>
Reply-To: Baranosiu <rad_n@wp.pl>
NNTP-Posting-Host: user-164-126-63-157.play-internet.pl
Mime-Version: 1.0
X-Trace: news.task.gda.pl 1349704489 19148 164.126.63.157 (8 Oct 2012 13:54:49 GMT)
X-Complaints-To: abuse@news.task.gda.pl
NNTP-Posting-Date: Mon, 8 Oct 2012 13:54:49 +0000 (UTC)
User-Agent: slrn/pre1.0.0-18 (Linux)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit