Beispiel #1
0
/* Main computational kernel. The whole function will be timed,
   including the call and return. */
static
void kernel_correlation(int m, int n,
			DATA_TYPE float_n,
			DATA_TYPE POLYBENCH_2D(data,M,N,m,n),
			DATA_TYPE POLYBENCH_2D(symmat,M,M,m,m),
			DATA_TYPE POLYBENCH_1D(mean,M,m),
			DATA_TYPE POLYBENCH_1D(stddev,M,m))
{
  int i, j, j1, j2;

  DATA_TYPE eps = 0.1f;

#define sqrt_of_array_cell(x,j) sqrt(x[j])

#pragma acc data				\
  copyin (data),				\
  copyout (mean, stddev, symmat)
  {
    /* Determine mean of column vectors of input data matrix */
    #pragma acc parallel
    {
      #pragma acc loop
      for (j = 0; j < _PB_M; j++)
	{
	  mean[j] = 0.0;
          #pragma acc loop
	  for (i = 0; i < _PB_N; i++)
	    mean[j] += data[i][j];
	  mean[j] /= float_n;
	}
    
      /* Determine standard deviations of column vectors of data matrix. */
      #pragma acc loop
      for (j = 0; j < _PB_M; j++)
	{
	  stddev[j] = 0.0;
          #pragma acc loop
	  for (i = 0; i < _PB_N; i++)
	    stddev[j] += (data[i][j] - mean[j]) * (data[i][j] - mean[j]);
	  stddev[j] /= float_n;
	  stddev[j] = sqrt_of_array_cell(stddev, j);
	  /* The following in an inelegant but usual way to handle
	     near-zero std. dev. values, which below would cause a zero-
	     divide. */
	  stddev[j] = stddev[j] <= eps ? 1.0 : stddev[j];
	}
    
      /* Center and reduce the column vectors. */
      #pragma acc loop
      for (i = 0; i < _PB_N; i++)
        #pragma acc loop
	for (j = 0; j < _PB_M; j++)
	  {
	    data[i][j] -= mean[j];
	    data[i][j] /= sqrt(float_n) * stddev[j];
	  }
    
      /* Calculate the m * m correlation matrix. */
      #pragma acc loop
      for (j1 = 0; j1 < _PB_M-1; j1++)
	{
	  symmat[j1][j1] = 1.0;
          #pragma acc loop
	  for (j2 = j1+1; j2 < _PB_M; j2++)
	    {
	      symmat[j1][j2] = 0.0;
              #pragma acc loop
	      for (i = 0; i < _PB_N; i++)
		symmat[j1][j2] += (data[i][j1] * data[i][j2]);
	      symmat[j2][j1] = symmat[j1][j2];
	    }
	}
    }
  }
  symmat[_PB_M-1][_PB_M-1] = 1.0;
}
Beispiel #2
0
void correlation(DATA_TYPE* data, DATA_TYPE* mean, DATA_TYPE* stddev, DATA_TYPE* symmat)
{
	int i, j, j1, j2;	
	
	// Determine mean of column vectors of input data matrix 
  	for (j = 1; j <= M; j++)
   	{
  		mean[j] = 0.0;

   		for (i = 1; i <= N; i++)
		{
			mean[j] += data[i*(M+1) + j];
   		}
		
		mean[j] /= (DATA_TYPE)FLOAT_N;
   	}

	// Determine standard deviations of column vectors of data matrix. 
  	for (j = 1; j <= M; j++)
   	{
   		stddev[j] = 0.0;
      
		for (i = 1; i <= N; i++)
		{
			stddev[j] += (data[i*(M+1) + j] - mean[j]) * (data[i*(M+1) + j] - mean[j]);
		}
		
		stddev[j] /= FLOAT_N;
    	stddev[j] = sqrt_of_array_cell(stddev, j);
    	stddev[j] = stddev[j] <= EPS ? 1.0 : stddev[j];
    }

 	// Center and reduce the column vectors. 
  	for (i = 1; i <= N; i++)
	{
    	for (j = 1; j <= M; j++)
    	{
			data[i*(M+1) + j] -= mean[j];
			data[i*(M+1) + j] /= sqrt(FLOAT_N) ;
			data[i*(M+1) + j] /= stddev[j];
    	}
	}

	// Calculate the m * m correlation matrix. 
  	for (j1 = 1; j1 <= M-1; j1++)
    {	
    	symmat[j1*(M+1) + j1] = 1.0;
    
		for (j2 = j1+1; j2 <= M; j2++)
		{
	  		symmat[j1*(M+1) + j2] = 0.0;

	  		for (i = 1; i <= N; i++)
			{
	   			symmat[j1*(M+1) + j2] += (data[i*(M+1) + j1] * data[i*(M+1) + j2]);
			}

	  		symmat[j2*(M+1) + j1] = symmat[j1*(M+1) + j2];
		}
    }
 
	symmat[M*(M+1) + M] = 1.0;
}
Beispiel #3
0
/* Main computational kernel. The whole function will be timed,
   including the call and return. */
    static
void kernel_correlation(int m, int n,
        DATA_TYPE float_n,
        DATA_TYPE POLYBENCH_2D(data,M,N,m,n),
        DATA_TYPE POLYBENCH_2D(symmat,M,M,m,m),
        DATA_TYPE POLYBENCH_1D(mean,M,m),
        DATA_TYPE POLYBENCH_1D(stddev,M,m))
{
    int i, j, j1, j2;

    DATA_TYPE eps = 0.1f;

#define sqrt_of_array_cell(x,j) sqrt(x[j])

    /* Determine mean of column vectors of input data matrix */

#pragma omp parallel
    {
#ifdef PRINT_ENV
        printf("- Thread[%d] Working\n", omp_get_thread_num());
#endif
#pragma omp for private (i)
        for (j = 0; j < _PB_M; j++)
        {
            mean[j] = 0.0;
            for (i = 0; i < _PB_N; i++)
                mean[j] += data[i][j];
            mean[j] /= float_n;
        }

        /* Determine standard deviations of column vectors of data matrix. */
#pragma omp for private (i)
        for (j = 0; j < _PB_M; j++)
        {
            stddev[j] = 0.0;
            for (i = 0; i < _PB_N; i++)
                stddev[j] += (data[i][j] - mean[j]) * (data[i][j] - mean[j]);
            stddev[j] /= float_n;
            stddev[j] = sqrt_of_array_cell(stddev, j);
            /* The following in an inelegant but usual way to handle
               near-zero std. dev. values, which below would cause a zero-
               divide. */
            stddev[j] = stddev[j] <= eps ? 1.0 : stddev[j];
        }

        /* Center and reduce the column vectors. */
#pragma omp for private (j)
        for (i = 0; i < _PB_N; i++)
            for (j = 0; j < _PB_M; j++)
            {
                data[i][j] -= mean[j];
                data[i][j] /= sqrt(float_n) * stddev[j];
            }

        /* Calculate the m * m correlation matrix. */
#pragma omp for private (j2, i)
        for (j1 = 0; j1 < _PB_M-1; j1++)
        {
            symmat[j1][j1] = 1.0;
            for (j2 = j1+1; j2 < _PB_M; j2++)
            {
                symmat[j1][j2] = 0.0;
                for (i = 0; i < _PB_N; i++)
                    symmat[j1][j2] += (data[i][j1] * data[i][j2]);
                symmat[j2][j1] = symmat[j1][j2];
            }
        }
        symmat[_PB_M-1][_PB_M-1] = 1.0;
    }
}
Beispiel #4
0
void runCorr(DATA_TYPE pdata[M+1][N+1], DATA_TYPE psymmat[M+1][M+1], DATA_TYPE pstddev[M+1], DATA_TYPE pmean[M+1], DATA_TYPE pfloat_n, DATA_TYPE peps)
{
	int i, j, j1, j2;

	#define sqrt_of_array_cell(x,j) sqrt(x[j])

	/* Determine mean of column vectors of input data matrix */
	#pragma hmppcg grid blocksize 32 X 8

	for (j = 1; j <= M; j++)
	{
		pmean[j] = 0.0;

		for (i = 1; i <= N; i++)
		{
			pmean[j] += pdata[i][j];
		}

		pmean[j] /= pfloat_n;
	}

	/* Determine standard deviations of column vectors of data matrix. */
	#pragma hmppcg grid blocksize 32 X 8

	for (j = 1; j <= M; j++)
	{
		pstddev[j] = 0.0;

		for (i = 1; i <= N; i++)
		{
			pstddev[j] += (pdata[i][j] - pmean[j]) * (pdata[i][j] - pmean[j]);
		}

		pstddev[j] /= pfloat_n;
		pstddev[j] = sqrt_of_array_cell(pstddev, j);

		/* The following in an inelegant but usual way to handle
		   near-zero std. dev. values, which below would cause a zero-
		   divide. */

		pstddev[j] = pstddev[j] <= peps ? 1.0 : pstddev[j];
	}


	/* Center and reduce the column vectors. */
	#pragma hmppcg grid blocksize 32 X 8
	for (i = 1; i <= N; i++)
	{
		for (j = 1; j <= M; j++)
		{
			pdata[i][j] -= pmean[j];
			pdata[i][j] /= sqrt(pfloat_n) * pstddev[j];
		}
	}

	/* Calculate the m * m correlation matrix. */
    
	#pragma hmppcg grid blocksize 32 X 8
	for (j1 = 1; j1 <= M-1; j1++)
	{
		psymmat[j1][j1] = 1.0;

		for (j2 = j1+1; j2 <= M; j2++)
		{
			psymmat[j1][j2] = 0.0;
            
			for (i = 1; i <= N; i++)
			{
				psymmat[j1][j2] += (pdata[i][j1] * pdata[i][j2]);
			}
			psymmat[j2][j1] = psymmat[j1][j2];
		}
	}

	psymmat[M][M] = 1.0;
}