// calculates \sum_K v_i'*A*v_i double dosum(Matrix A, Matrix v) { double alpha=0; Vector temp = createVector(A->rows); for( int i=0;i<v->cols;++i ) { myMxV(temp,A,v->col[i]); alpha += myinnerproduct(v->col[i], temp); } freeVector(temp); return alpha; }
// calculates \sum_K v_i'*A*v_i double dosum(Matrix A, Matrix v) { double alpha=0; Matrix temp = createMatrix(v->rows, v->cols); #pragma omp parallel for schedule(static) reduction(+:alpha) for( int i=0;i<v->cols;++i ) { myMxV(temp->col[i],A,v->col[i]); alpha += myinnerproduct(temp->col[i],v->col[i]); } freeMatrix(temp); return alpha; }
// calculates \sum_K v_i'*A*v_i double dosum(Matrix A, Matrix v) { double alpha=0; int t = omp_get_max_threads(); Matrix temp = createMatrix(A->rows,t); #pragma omp parallel for schedule(static) reduction(+:alpha) for( int i=0;i<v->cols;++i ) { myMxV(temp->col[omp_get_thread_num()],A,v->col[i]); alpha += myinnerproduct(temp->col[omp_get_thread_num()],v->col[i]); } freeMatrix(temp); return alpha; }
// calculates \sum_K v_i'*A*v_i double dosum(Matrix A, Matrix v) { double alpha=0; Vector temp = createVector(A->rows); for( int i=0;i<v->cols;++i ) { myMxV(temp,A,v->col[i]); alpha += myinnerproduct(temp,v->col[i]); } freeVector(temp); #ifdef HAVE_MPI double s2=alpha; MPI_Allreduce(&s2, &alpha, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); #endif return alpha; }
// calculates \sum_K v_i'*A*v_i double dosum(Matrix A, Matrix v) { double alpha=0.0; Matrix temp; int i, t; t = getMaxThreads(); temp = createMatrix(A->rows, t); #pragma omp parallel for schedule(static) reduction(+:alpha) for(i=0; i<v->cols; ++i) { myMxV(temp->col[getCurrentThread()],A,v->col[i]); alpha += myinnerproduct(temp->col[getCurrentThread()],v->col[i]); } freeMatrix(temp); return alpha; }