Hey Usman,

This is an example of false sharing in your code because the target address
is on the stack.
Other stack variables like t, total, n which are on the same cacheline.
Those are referenced in the for loop, which brings the
entire cacheline (including p) in the cache.

Based on your program, I created a working minimal example with the only
major change being allocating the addr in the heap.
With that I see:

 Latency of cached load: 20

 Latency of uncached load: 182

int main() {
  volatile unsigned long time;
    int *addr = new int(); // WORKS
    *addr = 0x12221;

     // Does not work.
     // int pO = 123456;
     // void * p = &pO;

    // 1. Load to ensure addr gets cached.
    // 2. Time access to cached addr.
    // 3. Flush addr.
    asm __volatile__ (
        " mfence \n"
        " movl (%1), %%eax \n"
        " lfence \n"
        " rdtsc \n"
        " lfence \n"
        " movl %%eax, %%esi \n"
        " movl (%1), %%eax \n"
        " lfence \n"
        " rdtsc \n"
        " subl %%esi, %%eax \n"
        " clflush 0(%1) \n"
        : "=a" (time)
        : "c" (addr)
        : "%esi", "%edx");


    printf("\n Latency of cached load: %lu \n", time);
    // Load value from memory.

    asm __volatile__ (
        " mfence \n"
        " lfence \n"
        " rdtsc \n"
        " lfence \n"
        " movl %%eax, %%esi \n"
        " movl (%1), %%eax \n"
        " lfence \n"
        " rdtsc \n"
        " subl %%esi, %%eax \n"
        : "=a" (time)
        : "c" (addr)
        : "%esi", "%edx");

    printf("\n Latency of uncached load: %lu \n", time);
}

Cheers,
Swapnil Haria,
PhD Candidate,
Dept of Computer Sciences,
University of Wisconsin-Madison

http://pages.cs.wisc.edu/~swapnilh/


On Fri, Oct 26, 2018 at 5:08 AM Usman Ali <msee17...@itu.edu.pk> wrote:

> Hi Swapnil Haria,
>
> Thanks for your kind reply, bellow is program which can be used to
> reproduce the effect,
>
> regards,
> Usman Ali
> MSEE Student, ITU, Lahore
>
> #include <stdio.h>
> #include <unistd.h>
>
>
> int probe(void *addr) {
>       volatile unsigned long time;
>       asm __volatile__ (
>               " mfence \n"
>               " lfence \n"
>               " rdtsc \n"
>               " lfence \n"
>               " movl %%eax, %%esi \n"
>               " movl (%1), %%eax \n"
>               " lfence \n"
>               " rdtsc \n"
>               " subl %%esi, %%eax \n"
>               " clflush 0(%1) \n"
>               : "=a" (time)
>               : "c" (addr)
>               : "%esi", "%edx");
>       return time;    
>
> }
>
>
> int readOnly(void *addr) {
>       volatile unsigned long time;
>       asm __volatile__ (
>               " mfence \n"
>               " lfence \n"
>               " rdtsc \n"
>               " lfence \n"
>               " movl %%eax, %%esi \n"
>               " movl (%1), %%eax \n"
>               " lfence \n"
>               " rdtsc \n"
>               " subl %%esi, %%eax \n"
>               : "=a" (time)
>               : "c" (addr)
>               : "%esi", "%edx");
>       return time;    
>
> }
>
> int main(void){
>       
>       int t=0, total = 0, n=100;
>
>       int pO = 123456;
>       void * p = &pO;
>       
>       for(int i=0; i < n; i++){
>               
>               if(i%2){
>               
>                       t = probe(p);
>                       t = probe(p);
>                       t = probe(p);
>               
>               }else{
>                       t = readOnly(p);
>                       t = readOnly(p);
>                       t = readOnly(p);
>               }
>               
>               printf("\n----Cycle: %d \n", t);
>               
>       }
>
>
>       printf("Done --ud-- \n");               
>       return 0;
>
>       sleep(1);
> }
>
>
>
>
>
>
>
> // END of PROGRAM
>
>
_______________________________________________
gem5-users mailing list
gem5-users@gem5.org
http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users

Reply via email to