 


#include <stdio.h>
#include <xmmintrin.h>
#include <emmintrin.h>
#include <mmintrin.h>


/* ICC sous Windows
#define CPUID __asm __emit 0fh __asm __emit 0a2h
#define RDTSC __asm __emit 0fh __asm __emit 031h

unsigned __int64 dtime(){
		unsigned cycles_low, cycles_high;

		__asm {
				pushad
				CPUID			
				RDTSC
				mov	cycles_high, edx			
				mov	cycles_low, eax	
				popad
				}
			return ((unsigned __int64)cycles_high << 32) | cycles_low;
	}
// ICC Windows (fin) */

//ICC Linux
long long readTSC ();

long long readTSC ()
{
  long long t;
  asm volatile (".byte 0x0f,0x31" : "=A" (t));

  return t;      
}
double dtime()
{
  return (double) readTSC();
}
// ICC Linux (fin) */


#define N 1000
double t1, texe, overhead;
int X[N][N], Y[N][N];
float A[N];
int Z[N];
int S; 
double t1, texe;
void main_copy();


int sumrec (int x)
{
	return (x <1 ? 0: x+sumrec(x-1));
}

int sumite(int x)
{
	int i, tmp=0;
	for (i=1; i<=x; i++)
		tmp+=i;
	return tmp;
}

void foo(int x)
{
	int i;
	Z[0]=0;
	for (i=1; i<=x; i++)
		Z[i]=Z[i-1]+1;
}

void fou(int x)
{
	int i;
	Z[0]=0;
	for (i=1; i<=x; i++)
		Z[i]=Z[0]+i;
}

void fov(int x)
{
	int i;
	for (i=0; i<=x; i++)
		Z[i]=i;
}


void main_copy_ij()
{
	int i, j, k;
	for (k=0;k<10;k++){

t1=dtime();
for (i=0;i<N;i++)
for (j=0;j<N;j++)
Y[i][j]=X[i][j];

 texe=dtime()-t1 ; 
  printf ("Temps copie par element-ij %f  N %d \n", (double) (texe)/(double)(N*N), N);

	}
}

void main_copy_ji()
{
	int i, j, k;
	for (k=0;k<10;k++){

t1=dtime();
for (j=0;j<N;j++)
for (i=0;i<N;i++)
Y[i][j]=X[i][j];

 texe=dtime()-t1 ; 
  printf ("Temps copie par element-ji %f  N %d \n", (double) (texe)/(double)(N*N), N);

	}
}

void sum_N()
{
	int i, j, k;
for (k=0;k<10;k++){
t1=dtime();
S= sumrec(N);
 texe=dtime()-t1 ; 
  printf ("recursif/element %f  N %d \n", (double) (texe)/N, N);
	}
for (k=0;k<10;k++){
t1=dtime();
S= sumite(N);
 texe=dtime()-t1 ; 
  printf ("iteratif/element %f  N %d \n", (double) (texe)/N, N);
 // printf ("S=%d\n ", S);
	}
}

void enum_N()
{
int i, j, k;
for (k=0;k<10;k++){
t1=dtime();
foo (N);
 texe=dtime()-t1 ; 
  printf ("recurrence/element %f  N %d \n", (double) (texe)/N, N);
	}
for (k=0;k<10;k++){
t1=dtime();
fou(N);
 texe=dtime()-t1 ; 
  printf ("addition/element %f  N %d \n", (double) (texe)/N, N);
	}
for (k=0;k<10;k++){
t1=dtime();
fov(N);
 texe=dtime()-t1 ; 
  printf ("affectation/element %f  N %d \n", (double) (texe)/N, N);
	}
}

main()
{
main_copy_ij();
//main_copy_ji();
//sum_N();
//	enum_N();
} 









