Esempio n. 1
0
int main(int argc, char * argv[])
{
	const int BASE = 1024;
	int t;
	struct timeval start, end;
    int N_SIZE = 0, T_SIZE = 0;

    if (argc < 3) {
        printf("argc < 3, quit! \n");
        exit(1);
    }
    N_SIZE = StrToInt(argv[1]);
    T_SIZE = StrToInt(argv[2]);
    printf("N_SIZE = %d, T_SIZE = %d\n", N_SIZE, T_SIZE);
    
	/* Known */ Pochoir_Shape <1> heat_shape_1D [4] = {{0, 0}, {-1, 1}, {-1, 0}, {-1, -1}};

	/* toggle: 2; slopes: [1] */

	/* Known*/ Pochoir_Array <double, 1> a ( N_SIZE ) , b ( N_SIZE ) ;
/* Known */a.Register_Shape(heat_shape_1D);
	a.Register_Boundary(aperiodic_1D); /* Register_Boundary */
	/* Known */b.Register_Shape(heat_shape_1D);
	b.Register_Boundary(aperiodic_1D); /* Register_Boundary */
	for (int i = 0; i < N_SIZE; ++i) {
        a(0, i) = 1.0 * (rand() % BASE); 
        a(1, i) = 0; 
        b(0, i) = a(0, i);
        b(1, i) = 0;
	} 

	cout << "a(T+1, J) = 0.125 * (a(T, I+1) - 2.0 * a(T, I) + a(T, I-1)) + a(T, I)" << endl;
	gettimeofday(&start, 0);
    for (int times = 0; times < 1; ++times) {
   	for (int t = 0; t < T_SIZE; ++t) {
    for (int i = 0; i <= N_SIZE-1; ++i) {
        a(t+1, i) = 0.125 * (a(t, i+1) - 2.0 * a(t, i) + a(t, i-1)) + a(t, i); } }
    }
	gettimeofday(&end, 0);
	std::cout << "Pochoir ET: consumed time :" << 1.0e3 * tdiff(&end, &start)/1 << "ms" << std::endl;

	gettimeofday(&start, 0);
    for (int times = 0; times < 1; ++times) {
	for (int t = 0; t < T_SIZE; ++t) {
    _Cilk_for (int i = 0; i <= N_SIZE-1; ++i) {
        b(t+1, i) = 0.125 * (b(t, i+1) - 2.0 * b(t, i) + b(t, i-1)) + b(t, i); } }
    }
	gettimeofday(&end, 0);
	std::cout << "Naive Loop: consumed time :" << 1.0e3 * tdiff(&end, &start)/1 << "ms" << std::endl;

	t = T_SIZE;
	for (int i = 0; i <= N_SIZE-1; ++i) {
		check_result(t, i, a.interior(t, i), b.interior(t, i));
	}  

	return 0;
}
Esempio n. 2
0
template <typename T> T periodic_1D (
	/* Known*/ Pochoir_Array <T, 1> &arr, int t, int i) {
    const int arr_size_0 = arr.size(0);

    int new_i = (i >= arr_size_0) ? (i - arr_size_0) : (i < 0 ? i + arr_size_0 : i);

    /* we use arr.get(...) instead of arr(...) to implement different boundary
     * checking strategy: In arr(...), if off-boundary access occurs, we call
     * boundary function to supply a value; in arr.get(...), if off-boundary 
     * access occurs, we will print the off-boundary access and quit!
     */
    return arr.get(t, new_i);
}
Esempio n. 3
0
void computeCoeffs( double r, double V, double T, int ns, int nt,
		    Pochoir_Array< double, N_RANK > &c )
{
   double V2 = V * V;
   double dt = T / nt;
   double r1 = 1.0 / ( 1.0 + r * dt );
   double r2 = dt / ( 1.0 + r * dt );
   
   cilk_for ( int i = 0; i <= ns; ++i )
     {
       c.interior( 0, i ) = r2 * 0.5 * i * ( - r + V2 * i );       
       c.interior( 1, i ) = r1 * ( 1 - V2 * i * i * dt );
       c.interior( 2, i ) = r2 * 0.5 * i * ( r + V2 * i );       
     }
}
Esempio n. 4
0
int main(int argc, char * argv[])
{
	const int BASE = 1024;
	int t;
	struct timeval start, end;
    int N_SIZE = 0, T_SIZE = 0;

    if (argc < 3) {
        printf("argc < 3, quit! \n");
        exit(1);
    }
    N_SIZE = StrToInt(argv[1]);
    T_SIZE = StrToInt(argv[2]);
    printf("N_SIZE = %d, T_SIZE = %d\n", N_SIZE, T_SIZE);
    
	/* Known */ Pochoir_Shape <2> heat_shape_2D [6] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 0}, {0, -1, 0}, {0, 0, -1}, {0, 0, 1}};

    Pochoir<2> heat_2D(heat_shape_2D);
	/* Known*/ Pochoir_Array <double, 2> a ( N_SIZE, N_SIZE ) , b ( N_SIZE, N_SIZE ) ;
/* Known */a.Register_Shape(heat_shape_2D);
	a.Register_Boundary(periodic_2D); /* Register_Boundary */
    heat_2D.Register_Array(a);
	/* Known */b.Register_Shape(heat_shape_2D);
	b.Register_Boundary(periodic_2D); /* Register_Boundary */
	for (int i = 0; i < N_SIZE; ++i) {
	for (int j = 0; j < N_SIZE; ++j) {
        a(0, i, j) = 1.0 * (rand() % BASE); 
        a(1, i, j) = 0; 
        b(0, i, j) = a(0, i, j);
        b(1, i, j) = 0;
	} }

	cout << "a(T+1, J, I) = 0.125 * (a(T, J+1, I) - 2.0 * a(T, J, I) + a(T, J-1, I)) + 0.125 * (a(T, J, I+1) - 2.0 * a(T, J, I) + a(T, J, I-1)) + a(T, J, I)" << endl;

	gettimeofday(&start, 0);
    for (int times = 0; times < 1; ++times) {
	for (int t = 0; t < T_SIZE; ++t) {
    for (int i = 0; i < N_SIZE; ++i) {
	for (int j = 0; j < N_SIZE; ++j) {
        a(t+1, i, j) = 0.125 * (a(t, i+1, j) - 2.0 * a(t, i, j) + a(t, i-1, j)) + 0.125 * (a(t, i, j+1) - 2.0 * a(t, i, j) + a(t, i, j-1)) + a(t, i, j); } } } 
    }
	gettimeofday(&end, 0);
	std::cout << "Pochoir : consumed time :" << 1.0e3 * tdiff(&end, &start)/1 << "ms" << std::endl;

	gettimeofday(&start, 0);
    for (int times = 0; times < 1; ++times) {
	for (int t = 0; t < T_SIZE; ++t) {
    cilk_for (int i = 0; i < N_SIZE; ++i) {
	for (int j = 0; j < N_SIZE; ++j) {
        b(t+1, i, j) = 0.125 * (b(t, i+1, j) - 2.0 * b(t, i, j) + b(t, i-1, j)) + 0.125 * (b(t, i, j+1) - 2.0 * b(t, i, j) + b(t, i, j-1)) + b(t, i, j); } } }
    }
	gettimeofday(&end, 0);
	std::cout << "Naive Loop: consumed time :" << 1.0e3 * tdiff(&end, &start)/1 << "ms" << std::endl;

	t = T_SIZE;
	for (int i = 0; i <= N_SIZE-1; ++i) {
	for (int j = 0; j <= N_SIZE-1; ++j) {
		check_result(t, i, j, a.interior(t, i, j), b.interior(t, i, j));
	} } 

	return 0;
}