scf_celebic/ex5/code/task_1/demo_skalar/mylib.cpp
dino.celebic 3d054f8ae7 ex5 task5
2025-12-09 23:23:51 +01:00

84 lines
No EOL
2.1 KiB
C++

#include "mylib.h"
#include <cassert> // assert()
#include <cmath>
#include <iostream>
#include <functional> // multiplies<>{}
#include <list>
#include <numeric> // iota()
#ifdef _OPENMP
#include <omp.h>
#endif
#include <vector>
using namespace std;
double scalar(vector<double> const &x, vector<double> const &y)
{
assert(x.size() == y.size()); // switch off via compile flag: -DNDEBUG
size_t const N = x.size();
double sum = 0.0;
#pragma omp parallel for default(none) shared(x,y,N) reduction(+:sum) schedule(static)
for (size_t i = 0; i < N; ++i)
{
sum += x[i] * y[i];
//sum += exp(x[i])*log(y[i]);
}
return sum;
}
double scalar2(vector<double> const &x, vector<double> const &y)
{
assert(x.size() == y.size());
size_t const N = x.size();
double sum = 0.0;
#pragma omp parallel shared(x,y,N,sum)
{
double local_sum = 0.0;
int const th_id = omp_get_thread_num();
int const nthrds = omp_get_num_threads();
for (size_t i = th_id; i < N; i += nthrds) {
local_sum += x[i] * y[i];
}
#pragma omp atomic
sum += local_sum;
}
return sum;
}
vector<int> reduction_vec(int n)
{
vector<int> vec(n);
#pragma omp parallel default(none) shared(cout) reduction(VecAdd:vec)
{
#pragma omp barrier
#pragma omp critical
cout << omp_get_thread_num() << " : " << vec.size() << endl;
#pragma omp barrier
iota( vec.begin(),vec.end(), omp_get_thread_num() );
#pragma omp barrier
#pragma omp critical
cout << vec << endl;
}
return vec;
}
vector<int> reduction_vec_append(int n)
{
vector<int> vec;
#pragma omp parallel default(none) shared(cout,n) reduction(VecAppend:vec)
{
vector<int> local(n);
#pragma omp barrier
#pragma omp critical
cout << omp_get_thread_num() << " : " << local.size() << endl;
#pragma omp barrier
iota( local.begin(),local.end(), omp_get_thread_num() );
#pragma omp critical
vec.insert(vec.end(), local.begin(), local.end());
}
return vec;
}