No differences.
Additions:
~1) vedere poi se è possibile applicare qualche **ottimizzazione manuale del codice**, purché quell'ottimizzazione **non sia già comunque applicata dal compilatore** (l'unico modo per esserne certi è esaminare il codice assembly generato).
Deletions:
~1) vedere poi se è possibile applicare qualche **ottimizzazione manuale del codice**, purché quell'ottimizzazione **non sia già comunque applicata dal compilatore** (l'unico modo per esserne certi è esaminare il codice assembly generato; si veda ad esempio il modulo assembly ##es2.s## fornito in calce al testo generato a partire da ##es2.c## con ##gcc m32 S -O1 es2.c##).
Il seguente file è stato generato da ##gcc -O1 -S es2.c##:
%%(c;es2.s)
.file "es2.c"
.globl get
.type get, @function
get:
.LFB15:
movl 8(%esp), %edx
je .L2
testl %edx, %edx
je .L2
movl 4(%eax), %eax
je .L2
subl $1, %edx
.L2:
.p2align 4,,3
.LFE15:
.size get, .-get
.globl sum_range
.type sum_range, @function
sum_range:
.LFB16:
pushl %ebp
.cfi_offset 5, -8
pushl %edi
.cfi_def_cfa_offset 12
.cfi_offset 7, -12
pushl %esi
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
.cfi_def_cfa_offset 20
.cfi_offset 3, -20
subl $8, %esp
.cfi_def_cfa_offset 28
movl 28(%esp), %ebp
movl 32(%esp), %ebx
movl 36(%esp), %edi
cmpl %edi, %ebx
jge .L7
movl $0, %esi
.L6:
movl %ebx, 4(%esp)
movl %ebp, (%esp)
call get
addl (%eax), %esi
addl $1, %ebx
cmpl %edi, %ebx
jne .L6
jmp .L5
.L7:
movl $0, %esi
movl %esi, %eax
addl $8, %esp
.cfi_def_cfa_offset 20
.cfi_def_cfa_offset 16
popl %esi
.cfi_restore 6
.cfi_def_cfa_offset 12
popl %edi
.cfi_restore 7
popl %ebp
.cfi_restore 5
.LFE16:
.size sum_range, .-sum_range
Additions:
**Nota bene:**
~- ogni volta che l'eseguibile viene eseguito, il file ##gmon.out## viene rigenerato;
~- il file ##gmon.out## viene generato **solo** se il programma termina correttamente.
Deletions:
**Nota bene:** ogni volta che l'eseguibile viene eseguito, il file ##gmon.out## viene rigenerato.
**Nota bene:** il file ##gmon.out## viene generato solo se il programma termina correttamente.
Additions:
~1) durante l'esame verrà chiesto di rispondere alla domanda motivando la risposta, spiegando cioè sia quali ottimizzazioni (es. constant folding, ecc.) sono state effettuate e in quali punti del codice assembly (es. "il compilatore ha inserito l'istruzione xyz", ecc.).
Additions:
Compilare due versioni del programma, usando per entrambe ##gcc## a 32 bit con livello di ottimizzazione O1 e lo stesso modulo ##es2-main.c## riportato in calce al testo:
~1) non ottimizzata manualmente: eseguibile ##es2##;
~1) ottimizzata manualmente: eseguibile ##es2-opt##.
~1) descrivere le ottimizzazioni manuali applicate e dire perché si ritiene che siano efficaci;
Deletions:
Compilare due versioni del programma, usando ##gcc## a 32 bit con livello di ottimizzazione O1 e lo stesso modulo ##es2-main.c## riportato in calce al testo:
~1) non ottimizzata: eseguibile ##es2##;
~1) ottimizzata: eseguibile ##es2-opt##.
~1) descrivere le ottimizzazioni applicate e dire perché si ritiene che siano efficaci;
#include "es4.h"
Additions:
gcc -o result -pg main.c file.s -m32
Al termine dell'esecuzione, la directory corrente conterrà un file chiamato "##gmon.out##". Tale file contiene le statistiche raccolte da ##gprof## durante la precedente esecuzione. Tale statistiche possono essere ispezionate utilizzando il comando ##gprof##:
gprof ./result
Si noti che occorre passare al comando ##gprof## il path all'eseguibile che è stato eseguito.
Per salvare su file, l'output di ##gprof## è sufficiente:
gprof ./result > output.txt
**Nota bene:** ogni volta che l'eseguibile viene eseguito, il file ##gmon.out## viene rigenerato.
**Nota bene:** il file ##gmon.out## viene generato solo se il programma termina correttamente.
Deletions:
gcc -o result -pg main.c file.s
Additions:
**GARA**: chi ottiene il migliore speedup per il programma ##es2##?
Deletions:
**GARA##: chi ottiene il migliore speedup per il programma ##es2##?
Additions:
==Esercizio 2 - Gara (profilazione prestazioni e ottimizzazione del work)==
**GARA##: chi ottiene il migliore speedup per il programma ##es2##?
Deletions:
==Esercizio 2 (profilazione prestazioni e ottimizzazione del work)==
Additions:
.file "es1a.c"
.globl es1a
.type es1a, @function
es1a:
.LFB0:
addl $10, %eax
.LFE0:
.size es1a, .-es1a
.file "es1b.c"
.globl somma
.type somma, @function
somma:
.LFB0:
movl 8(%esp), %eax
addl 4(%esp), %eax
.LFE0:
.size somma, .-somma
.globl es1b
.type es1b, @function
es1b:
.LFB1:
.cfi_offset 3, -8
movl 8(%esp), %ecx
movl 12(%esp), %eax
jle .L5
movl %ecx, %edx
leal (%ecx,%eax,4), %ebx
movl $0, %eax
.L4:
movl %eax, %ecx
addl (%edx), %ecx
addl %ecx, %eax
addl $4, %edx
cmpl %ebx, %edx
jne .L4
jmp .L3
movl $0, %eax
.LFE1:
.size es1b, .-es1b
.file "es1c.c"
.globl es1c
.type es1c, @function
es1c:
.LFB0:
movl 8(%esp), %ecx
testl %ecx, %ecx
jle .L4
leal 1(%ecx), %edx
imull %ecx, %edx
addl %edx, %ecx
movl $0, %eax
addl %edx, %eax
addl $1, %edx
cmpl %ecx, %edx
.L4:
movl $0, %eax
.LFE0:
.size es1c, .-es1c
Additions:
int es1a(int a) {
int c = 10;
return a+c;
%%(c;es1b.c)
int somma(int a, int b) {
return a+b;
int es1b(int* v, int n) {
for (i=0; i
s += somma(s,v[i]);
int es1c(int* v, int n) {
for (i=0; i
s += n*(n+1) + i;
Deletions:
%%(c;es1.c)
Additions:
Si consideri il seguenti moduli C e le relative traduzioni in assembly IA32 realizzate con ##gcc -O1 -S es1x.c##. Per ciascuno identificare **quali ottimizzazioni sono state applicate automaticamente dal compilatore fra quelle viste a lezione** nelle funzioni principali (##es1x##).
**Note:**
~1) ai fini dell'esercizio è possibile ignorare le direttive che appaiono nei file ##.s## e che non abbiamo visto a lezione: ad esempio, ##.file##, ##.text##, ##.LF...##, ##.cfi_...##, ##.size##, ##.iden##, ##.section##.
~1) se nel codice assembly appaiono istruzioni che non conoscete, potete consultare il sito [[http://x86.renejeschke.de]] che fornisce una versione "distillata" dei manuali Intel.
**Modulo 1b:**
%%(c;es1.c)
%%(c;es1b.s)
**Modulo 1c:**
%%(c;es1c.c)
%%(c;es1c.s)
Deletions:
Si consideri il seguenti moduli C e le relative traduzioni in assembly IA32 realizzate con ##gcc -O1 -S es1x.c##. Per ciascuno identificare **quali ottimizzazioni sono state applicate automaticamente dal compilatore fra quelle viste a lezione** nelle funzioni principali (##es1x##).
**Note:** ai fini dell'esercizio è possibile ignorare le direttive che appaiono nei file ##.s## e che non abbiamo visto a lezione: ad esempio, ##.file##, ##.text##, ##.LF...##, ##.cfi_...##, ##.size##, ##.iden##, ##.section##.
int es1a(int a) {
int c = 10;
return a+c;
.file "es1a.c"
.globl es1a
.type es1a, @function
es1a:
.LFB0:
addl $10, %eax
.LFE0:
.size es1a, .-es1a
Additions:
Compilare un programma C/assembly usando l'opzione ##-pg##. Ad esempio:
gcc -o result -pg main.c file.s
Eseguire il programma normalmente. Ad esempio:
./result arg1 arg2
Deletions:
Compilare un programma C/assembly per `gprof`:
gcc -o result -pg file.c file.s [...]
Additions:
Compilare un programma C/assembly per `gprof`:
Deletions:
Compilare un programma C/assembly per gprof:
Additions:
== Promemoria: uso di gprof ==
Compilare un programma C/assembly per gprof:
%%(bash;)
gcc -o result -pg file.c file.s [...]
Si consideri il seguenti moduli C e le relative traduzioni in assembly IA32 realizzate con ##gcc -O1 -S es1x.c##. Per ciascuno identificare **quali ottimizzazioni sono state applicate automaticamente dal compilatore fra quelle viste a lezione** nelle funzioni principali (##es1x##).
**Note:** ai fini dell'esercizio è possibile ignorare le direttive che appaiono nei file ##.s## e che non abbiamo visto a lezione: ad esempio, ##.file##, ##.text##, ##.LF...##, ##.cfi_...##, ##.size##, ##.iden##, ##.section##.
Deletions:
Si consideri il seguenti moduli C e le relative traduzioni in assembly IA32 realizzate con ##gcc -O1 -S es1x.c##. Per ciascuno identificare **quali ottimizzazioni sono state applicate automaticamente dal compilatore fra quelle viste a lezione** nelle funzioni principali (##es1x##).
**Note:**
~1) ai fini dell'esercizio è possibile ignorare le direttive che appaiono nei file ##.s## e che non abbiamo visto a lezione: ad esempio, ##.file##, ##.text##, ##.LF...##, ##.cfi_...##, ##.size##, ##.iden##, ##.section##.
~1) se nel codice assembly appaiono istruzioni che non conoscete, potete consultare il sito [[http://x86.renejeschke.de]] che fornisce una versione "distillata" dei manuali Intel.
**Modulo 1b:**
%%(c;es1.c)
int somma(int a, int b) {
return a+b;
int es1b(int* v, int n) {
for (i=0; i
s = somma(s,v[i]);
%%(c;es1b.s)
.file "es1b.c"
.globl somma
.type somma, @function
somma:
movl 8(%esp), %eax
addl 4(%esp), %eax
.size somma, .-somma
.globl es1b
.type es1b, @function
es1b:
.LFB1:
movl 4(%esp), %ecx
movl 8(%esp), %eax
jle .L5
movl %ecx, %edx
leal (%ecx,%eax,4), %ecx
movl $0, %eax
.L4:
addl (%edx), %eax
addl $4, %edx
cmpl %ecx, %edx
jne .L4
movl $0, %eax
.LFE1:
.size es1b, .-es1b
**Modulo 1c:**
%%(c;es1c.c)
int es1c(int* v, int n) {
for (i=0; i
s = n*(n+1) + i;
%%(c;es1c.s)
.file "es1c.c"
.globl es1c
.type es1c, @function
es1c:
jle .L5
movl $0, %eax
.L4:
addl $1, %eax
cmpl %edx, %eax
jne .L4
leal 1(%edx), %eax
imull %edx, %eax
leal -1(%edx,%eax), %eax
movl $0, %eax
.size es1c, .-es1c
Additions:
%%(c;es1c.s)
.file "es1c.c"
.globl es1c
.type es1c, @function
es1c:
addl $1, %eax
cmpl %edx, %eax
leal 1(%edx), %eax
imull %edx, %eax
leal -1(%edx,%eax), %eax
.size es1c, .-es1c
Additions:
**Modulo 1c:**
%%(c;es1c.c)
int es1c(int* v, int n) {
s = n*(n+1) + i;
No differences.
Additions:
**Note:**
~1) ai fini dell'esercizio è possibile ignorare le direttive che appaiono nei file ##.s## e che non abbiamo visto a lezione: ad esempio, ##.file##, ##.text##, ##.LF...##, ##.cfi_...##, ##.size##, ##.iden##, ##.section##.
~1) se nel codice assembly appaiono istruzioni che non conoscete, potete consultare il sito [[http://x86.renejeschke.de]] che fornisce una versione "distillata" dei manuali Intel.
Deletions:
Se appaiono istruzioni che non conoscete, potete consultare il sito [[http://x86.renejeschke.de]] che fornisce una versione "distillata" dei manuali Intel.
**Note:** ai fini dell'esercizio è possibile ignorare le direttive che appaiono nei file ##.s## e che non abbiamo visto a lezione: ad esempio, ##.file##, ##.text##, ##.LF...##, ##.cfi_...##, ##.size##, ##.iden##, ##.section##.
Additions:
Se appaiono istruzioni che non conoscete, potete consultare il sito [[http://x86.renejeschke.de]] che fornisce una versione "distillata" dei manuali Intel.
Deletions:
Se vi sono istruzioni che non conoscete, potete consultare il sito [[http://x86.renejeschke.de]] che fornisce una versione "distillata" dei manuali Intel.