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));
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}