FIFA-2022 Career Guide Free Tutorials Go to Your University Placement Preparation 
0 like 0 dislike
361 views
in Tutorial & Interview questions by Goeduhub's Expert (9.3k points)

 Iterating through an array eciently and rowmajor order

1 Answer

0 like 0 dislike
by Goeduhub's Expert (9.3k points)
 
Best answer
Arrays in C can be seen as a contiguous chunk of memory. More precisely, the last dimension of the array is the contiguous part. We call this the row-major order. Understanding this and the fact that a cache fault loads a complete cache line into the cache when accessing uncached data to prevent subsequent cache faults, we can see why accessing an array of dimension 10000x10000 with array[0][0] would potentially load array[0][1] in cache, but accessing array[1][0] right after would generate a second cache fault, since it is sizeof(type)*10000 bytes away from array[0][0], and therefore certainly not on the same cache line. Which is why iterating like this is inefficient:

#define ARRLEN 10000

int array[ARRLEN][ARRLEN];

size_t i, j;

for (i = 0; i < ARRLEN; ++i)

{    

for(j = 0; j < ARRLEN; ++j)    

{        

array[j][i] = 0;    

}

}

And iterating like this is more efficient:

#define ARRLEN 10000

int array[ARRLEN][ARRLEN];

size_t i, j;

for (i = 0; i < ARRLEN; ++i)

{    

for(j = 0; j < ARRLEN; ++j)    

{        

array[i][j] = 0;    

}

}

In the same vein, this is why when dealing with an array with one dimension and multiple indexes (let's say 2 dimensions here for simplicity with indexes i and j) it is important to iterate through the array like this:

#define DIM_X 10

#define DIM_Y 20

int array[DIM_X*DIM_Y];

size_t i, j;

for (i = 0; i < DIM_X; ++i)

{    

for(j = 0; j < DIM_Y; ++j)    

{        

array[i*DIM_Y+j] = 0;    

}

}

Or with 3 dimensions and indexes i,j and k:

#define DIM_X 10

#define DIM_Y 20

#define DIM_Z 30

int array[DIM_X*DIM_Y*DIM_Z];

size_t i, j, k;

for (i = 0; i < DIM_X; ++i)

{    

for(j = 0; j < DIM_Y; ++j)    

{        

for (k = 0; k < DIM_Z; ++k)        

{            

array[i*DIM_Y*DIM_Z+j*DIM_Z+k] = 0;        

}    

}

}

Or in a more generic way, when we have an array with N1 x N2 x ... x Nd elements, d dimensions and indices noted as n1,n2,...,nd the offset is calculated like this

Learn & Improve In-Demand Data Skills Online in this Summer With  These High Quality Courses[Recommended by GOEDUHUB]:-

Best Data Science Online Courses[Lists] on:-

Claim your 10 Days FREE Trial for Pluralsight.

Best Data Science Courses on Datacamp
Best Data Science Courses on Coursera
Best Data Science Courses on Udemy
Best Data Science Courses on Pluralsight
Best Data Science Courses & Microdegrees on Udacity
Best Artificial Intelligence[AI] Courses on Coursera
Best Machine Learning[ML] Courses on Coursera
Best Python Programming Courses on Coursera
Best Artificial Intelligence[AI] Courses on Udemy
Best Python Programming Courses on Udemy

 Important Lists:

Important Lists, Exams & Cutoffs Exams after Graduation PSUs

 Goeduhub:

About Us | Contact Us || Terms & Conditions | Privacy Policy ||  Youtube Channel || Telegram Channel © goeduhub.com Social::   |  | 

 

Free Online Directory

...