Ejercicio Thread

La multiplicación escalar entre dos vector u y v está definida así:

\(i \in [0,n],w[i]=u[i]∗v[i]\)

Utilizando thread como librería haga:

  • Llenado de u y v con un valor constante pequeño (menor que 10)
  • Calcular la multiplicación entre los dos vectores de forma paralelización
  • Calcular la suma del vector resultante
  • Imprimir el resultado
  • Imprimir el tiempo de ejecución

El classroom sólo valida que el programa compile, el docente revisará manualmente la implementación de cada estudiante

#include <chrono>
#include <iostream>
#include <thread>
#include <vector>

using namespace std;
using namespace std::chrono;

const int VECTOR_SIZE = 1000000;
vector<long> v(VECTOR_SIZE);
vector<long> u(VECTOR_SIZE);
vector<long> w(VECTOR_SIZE);

void fillVector(int start, int end) {
  for (int i = start; i < end; i++) {
    v[i] = 10;
    u[i] = 20;
    w[i] = 0;
  }
}
void multVector(int start, int end) {
  for (int i = start; i < end; i++) {
    w[i] = v[i] * u[i];
  }
}

void sumVector(int start, int end, long &result) {
  for (int i = start; i < end; i++) {
    result += w[i];
  }
}

int main() {

  fillVector(0, VECTOR_SIZE);
  multVector(0, VECTOR_SIZE);

  auto start = high_resolution_clock::now();

  long result1 = 0, result2 = 0;
  thread t1(sumVector, 0, VECTOR_SIZE / 2, ref(result1));
  thread t2(sumVector, VECTOR_SIZE / 2, VECTOR_SIZE, ref(result2));

  t1.join();
  t2.join();

  auto stop = high_resolution_clock::now();
  auto duration = duration_cast<milliseconds>(stop - start);
  cout << "Time 2 threads: " << duration.count() << " ms" << endl;

  cout << "Result: " << result1 + result2 << endl;

  auto start2 = high_resolution_clock::now();
  long result = 0;

  sumVector(0, VECTOR_SIZE, result);

  auto stop2 = high_resolution_clock::now();
  auto duration2 = duration_cast<milliseconds>(stop2 - start2);
  cout << "Time seq: " << duration2.count() << " ms" << endl;
  cout << "Result: " << result << endl;

  start = high_resolution_clock::now();
  return 0;
}