/* 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; }
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; }
/* 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; } }
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; }