Cache Memory Caches depend on the locality principle – if you access memory locations near to each other, then you will get better performance because the cache will pull in a bunch of nearby locations every time you access main memory. Assume that multi-dimensional arrays in C are stored in “row major order”, that is, the elements in each row are stored together Example: int test[3][5] = { {1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15} } Would be laid out in memory like: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Which of these two programs fragments (a or b) should have better cache performance? You need only answer “a” or “b” – no explanation needed. // begin fragment a int big[100,1000]; for (i=0, i<100, i++) { for (j=0, j<999, j++) { big[i,j] += big[i,j+1]; } } // end fragment a // begin fragment b int big[100,1000]; for (j=0, j<999, j++) { for (i=0, i<100, i++) { big[i,j] += big[i,j+1]; } } // end fragment b
Cache Memory
Caches depend on the locality principle – if you access memory locations near to each other,
then you will get better performance because the cache will pull in a bunch of nearby locations
every time you access main memory. Assume that multi-dimensional arrays in C are stored in “row major order”, that is, the elements in each row are stored together
Example:
int test[3][5] = {
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15}
}
Would be laid out in memory like:
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
Which of these two programs fragments (a or b) should have better cache performance?
You need only answer “a” or “b” – no explanation needed.
// begin fragment a
int big[100,1000];
for (i=0, i<100, i++) {
for (j=0, j<999, j++) {
big[i,j] += big[i,j+1];
}
}
// end fragment a
// begin fragment b
int big[100,1000];
for (j=0, j<999, j++) {
for (i=0, i<100, i++) {
big[i,j] += big[i,j+1];
}
}
// end fragment b
Trending now
This is a popular solution!
Step by step
Solved in 3 steps