I have created a shared object and access it from two different program and measuring the time.
DATA array is the shared object between two processes.
Case 1: Use of while inside program1
program1 :
access shared DATA array ;// to load into memory and avoid page fault during access time calculation
start=timer;
access shared DATA array
end=timer;
Time_needed= end-start
printf("Inside Program1, Time1=%d\n",Time_needed);
start=timer;
access shared DATA array
end=timer;
Time_needed= end-start
printf("Inside Program1, Time2=%d\n",Time_needed);
while(1){}; // I replace this by sleep(1000) in CASE-2
Program2 :
access shared DATA array ;// to load into memory and avoid page fault during access time calculation
start=timer;
access shared DATA array
end=timer;
Time_needed= end-start
printf("Inside Program2, Time1=%d\n",Time_needed);
start=timer;
access shared DATA array
end=timer;
Time_needed= end-start
printf("Inside Program2, Time1=%d\n",Time_needed);
OUTPUT : First I run program1, then Program2
Inside Program1, Time1 = 17620
Inside Program1, Time1 = 17680
Inside Program2, Time1 = 7620
Inside Program2, Time1 = 7600
Case 2: Use of sleep() inside program1
program1 :
access shared DATA array ;// to load into memory and avoid page fault during access time calculation
start=timer;
access shared DATA array
end=timer;
Time_needed= end-start
printf("Inside Program1, Time1=%d\n",Time_needed);
start=timer;
access shared DATA array
end=timer;
Time_needed= end-start
printf("Inside Program1, Time2=%d\n",Time_needed);
sleep(1000);
Program2 :
access shared DATA array ;// to load into memory and avoid page fault during access time calculation
start=timer;
access shared DATA array
end=timer;
Time_needed= end-start
printf("Inside Program2, Time1=%d\n",Time_needed);
start=timer;
access shared DATA array
end=timer;
Time_needed= end-start
printf("Inside Program2, Time1=%d\n",Time_needed);
OUTPUT : First I run program1, then Program2
Inside Program1, Time1 = 17620
Inside Program1, Time1 = 17680
Inside Program2, Time1 = 17620
Inside Program2, Time1 = 17600
From the output in case -1, I can say shared data DATA array is loaded into memory/cache by 1st program and second program access it from cache. Whereas this also true for CASE-2, but the result looks like it is flushed out from cache while Program1 goes into sleep.
I am using GCC under linux.
Any clue ? Thanks in advance .
You didn't describe exactly how you run the different versions (different processes?), but assuming they're sequential - It is possible that you're seeing the affect of sleep()
It depends of course on the exact implementation and HW, but it's very likely to send your CPU into some power-saving/sleep state (that's what it's designed for). If that's the case, then the core caches will have to be flushed as part of the process, and you'll wake-up with cold caches. The whie loop on the other hand is intended to do a busy wait loop while grinding your CPU and keeping it alive (along with the caches), unless you happen to get a context switch along the way.
The exact details would again depend on implementation, on x86 you can use inline assembly to invoke monitor+mwait instructions that allow you to specify the exact C-state depth you want to achieve. The deeper it is, the more caches will get closed (mostly relevant for the L3).