AbstractLinAlgPack::value_type AbstractLinAlgPack::sum( const Vector& v_rhs ) { sum_op.reduct_obj_reinit(&*sum_targ); const Vector* vecs[1] = { &v_rhs }; apply_op(sum_op,1,vecs,0,NULL,&*sum_targ); return RTOp_ROp_sum_val(sum_op(*sum_targ)); }
int * arr_int_mkrand(size_t nints, int *sum_ptr) { int sum = 0; int *ret; ret = xmalloc(sizeof(int)*nints); for (size_t i=0; i<nints; i++) { ret[i] = rand() % 100; sum += sum_op(ret[i]); } *sum_ptr = sum; return ret; }
int main(int argc, const char *argv[]) { unsigned nthreads; size_t nints; int sum1, sum2; int *arr; nints = 0; if (argc > 1) nints = atol(argv[1]); if (nints == 0) nints = 100000; #pragma omp parallel #pragma omp master nthreads = omp_get_num_threads(); printf("Number of threads: %u\n", nthreads); printf("number of ints: %lu\n", nints); arr = arr_int_mkrand(nints, &sum1); sum2 = 0; tsc_t t; tsc_init(&t); tsc_start(&t); #pragma omp parallel for reduction(+:sum2) for (size_t i=0; i<nints; i++) { sum2 += sum_op(arr[i]); } tsc_pause(&t); tsc_report("sum_OMP", &t); if (sum1 != sum2) { fprintf(stderr, "Error in sum: %d vs %d\n", sum1, sum2); abort(); } printf("DONE\n"); return 0; }