#include <altivec.h>
float e;
int main(int argc, char *argv[]) {
int n = ...;
float *x, *y;
x = new float[n+1];
y = new float[n+1];
... // fill x, y
// do computation
float ve[4] = {0, 0, 0, 0}; e = 0;
#pragma omp for reduction(+:e)
for (int i=1; i<n; i+=4) {
float* yp = &y[i+1], y0 = &y[i], ym = &y[i-1];
vec_st(vec_madd(
vec_splats(.5),
vec_add(
vec_perm(vec_ld(0,ym), vec_ld(16,ym),
vec_lvsl(0,ym)),
vec_perm(vec_ld(0,yp), vec_ld(16,yp),
vec_lvsl(0,yp))),
vec_splats(0.)),
0, &x[i]);
vec_st(vec_add(
vec_ld(0,&ve[0]),vec_madd(
vec_ld(0,y0),
vec_ld(0,y0),
vec_splats(0.))),
0, &ve[0]);
}
e += ve[0] + ve[1] + ve[2] + ve[3];
... // output x, e
delete[] x, y;
return 0;
}
|