Permalänk
Medlem

C-programmering

hejsan jag sitter och tenta pluggar lite, håller på med en extentar och fastnar på 2 uppgifter.
Jag har gått igenom föreläsningarna , men tyvärr fattar jag inte dessa två än.

Hoppas någon kan hjälpa mig,

2 : Assume a friend has an array of structs where each struct has two struct members:

#difine N (10000000)

struct {

double a;
double b;
}data[N];

and process this data many times on a computer with a 32 byte cache block size.
Due to nature of the program , it turns out that every time each struct is processed only
one of a or b i saccessed , for instance as:

void process_a(double x)
{
int i;

for(i = 0; i<N;++i)
data[i].a ) data[i].a + x;

}

your friend asks you if you think there might be many cache misses and if there is a simple way to change the source code so the program becomes faster ? what do you say?

3

what is bad with the following program?

#include <assert.h>
#include <stdio.h>

FILE* openfile(char* name)
{

FILE* fp;

assert(((fp = fopen(name, "r")) != NULL);

return fp;

}

tack på förhand!

Permalänk
Medlem

För att citera mig själv på ett annat forum:

Citat:

2) Ungefär dubbelt så många cache missar på Nehalem, men då enbart på grund av otillräcklig minnesbandbredd. Hade koden istället varit "data[i].a = sqrt(data[i].a + x);" så hade vi inte haft fler cache missar (hint: prefetching). Vad du kan göra för att förbättra koden får du själv hitta i läroboken.
3) Öppna läroboken igen och bläddra till kapitlet om asserts. En hint är att kompilera och köra programmet i debug vs release läge (med eller utan -DNDEBUG flaggan i GCC).

Visa signatur

"Nothing is impossible because impossible itself says I M Possible..."

Permalänk

Fråga 2: När du använder minne så måste minnet mappas upp från RAM till cachen. Det tar längre tid att mappa upp mycket minne än lite. Man kan bara mappa upp minne i vissa strolekar (cache blocks), ofta typ 64 bytes. I den där koden kommer varannan double (8 bytes) användas och varannan inte användas. Men eftersom du inte kan mappa mindre än 64 bytes åt gången så måste du hämta även dom doubles:en du inte ska använda. Resultatet blir att du hämtar dubbelt så mycket minne från cachen än du hade behövt.

Problemet är enkelt att lösa om du förstår det.

Fråga 3: Rent tekniskt sätt så kommer inte kollen att göras i huvud taget när du kompilerar en release version. Då kommer den koden bara tas bort. Det är dessutom fult att använda assert för "fel som kan hända". Assert ska användas för att kontrollera att du som programmerar inte har gjort något fel, inte om användaren råkat ta bort en fil som behövs.

Permalänk
Medlem
Skrivet av jop_the_jopsan:

Fråga 2: När du använder minne så måste minnet mappas upp från RAM till cachen. Det tar längre tid att mappa upp mycket minne än lite. Man kan bara mappa upp minne i vissa strolekar (cache blocks), ofta typ 64 bytes. I den där koden kommer varannan double (8 bytes) användas och varannan inte användas. Men eftersom du inte kan mappa mindre än 64 bytes åt gången så måste du hämta även dom doubles:en du inte ska använda. Resultatet blir att du hämtar dubbelt så mycket minne från cachen än du hade behövt.

Problemet är enkelt att lösa om du förstår det.

Fråga 3: Rent tekniskt sätt så kommer inte kollen att göras i huvud taget när du kompilerar en release version. Då kommer den koden bara tas bort. Det är dessutom fult att använda assert för "fel som kan hända". Assert ska användas för att kontrollera att du som programmerar inte har gjort något fel, inte om användaren råkat ta bort en fil som behövs.

Hade detta varit SO hade jag gett dig en upvote. Fast, frågan specifierar att cache-storleken är 32 bytes, så det skulle kunna reflekteras i svaret ;). Det här med cache kan för övrigt förklaras på ett roligt sätt med The Paging Game.

Permalänk
Skrivet av You:

Hade detta varit SO hade jag gett dig en upvote. Fast, frågan specifierar att cache-storleken är 32 bytes, så det skulle kunna reflekteras i svaret ;). Det här med cache kan för övrigt förklaras på ett roligt sätt med The Paging Game.

haha den där var ju as bra! Den förklarar det ganska bra också!

Permalänk
Medlem

Vad är det för typ av kurs, nån som har nått material om sådana grejer (cache/processorer), länkar eller böcker? Jag gick nån datorarkitektur nån gång för många år sedan men hade fullt med andra kurser så blev inge vidare... Frågar av rent intresse

Permalänk
Medlem
Skrivet av Dalton Sleeper:

Vad är det för typ av kurs, nån som har nått material om sådana grejer (cache/processorer), länkar eller böcker? Jag gick nån datorarkitektur nån gång för många år sedan men hade fullt med andra kurser så blev inge vidare... Frågar av rent intresse

Här har du lite material kring det som behandlar det som är relevant för programmerare.

Se framförallt 3. The microarchitecture of Intel, AMD and VIA CPUs: An optimization guide for assembly programmers and compiler makers.

Software optimization resources. C++ and assembly. Windows, Linux, BSD, Mac OS X

Visa signatur

Assembly är ett högnivåspråk.

Permalänk
Medlem

Finfint!
Skrev någon simpel kompilator för nåra år sedan i nån kurs, så rubriken låter ju lite passande iaf, behöver fräscha upp lite allt möjligt nu när man tänker på det läsa på lite senare när jag har tid...