1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| #include <iostream>
#include <vector>
#include <thread>
#include <chrono>
#include <utility>
#include <algorithm>
#include <execution>
std::vector <std::pair<int, int>> Pair(const std::vector<int>& arr, int start, int end)
{
std::pair<int, int > paire;
std::vector <std::pair<int, int>> Vec_paire;
for (int i = start; i < end; ++i)
{
paire = { arr[i], arr[i] + 1 };
//std::cout << pair.first << ", " << pair.second << std::endl;
Vec_paire.emplace_back(paire);
}
return Vec_paire;
}
std::pair<int, int> Pair_each(int a)
{
std::pair<int, int > paire;
paire = { a, a + 1 };
return paire;
}
int main()
{
int num_threads;
const int array_size = 100;
std::vector<int> arr(array_size);
for (int i = 1; i < 5 ; i++)
{
num_threads = i;
// initilisation vector arr avec des valeurs de 0 à array_size-1
for (int i = 0; i < array_size; ++i)
{
arr[i] = i;
}
// création vector de threads
std::vector<std::thread> threads;
// division de vect arr en parts égale en fonction du nombre de theards choisi
int parts_size = array_size / num_threads;
int rest = array_size % num_threads;
std::vector <std::vector<std::pair<int, int>>> results(num_threads);
auto start1 = std::chrono::high_resolution_clock::now();
for (int i = 0; i < num_threads; ++i)
{
int start = i * parts_size;
int end = (i + 1) * parts_size;
if (i == num_threads-1)
end = (i + 1) * parts_size + rest;
threads.emplace_back([&arr, start, end, &results, i]()
{ results[i] = Pair(arr, start, end); });
}
// attendre fin d'exécution des threads
for (auto& thread : threads)
{
thread.join();
}
auto end1 = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::milli> float_ms1 = end1 - start1;
std::cout << "temps execusion pour " << num_threads << " threads : " << float_ms1.count() << " ms " << std::endl;
// affichage des valeurs
std::cout << "taille du vecteur resuts : " << results.size() << std::endl;
for (int i = 0; i < results.size(); i++)
{
std::cout << "contenu de resuts[" << i << "]" << std::endl;
for (int j = 0; j < results[i].size(); j++)
std::cout << "(" << results[i][j].first << ", " << results[i][j].second << "); ";
std::cout << std::endl;
}
}
// test for_each //
std::vector<std::pair<int, int>> results_each(array_size);
auto start2 = std::chrono::high_resolution_clock::now();
std::for_each(std::execution::par_unseq, arr.begin(), arr.end(), [&results_each](int x) {results_each[x] = Pair_each(x); });
auto end2 = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::milli> float_ms2 = end2 - start2;
std::cout << "temps execusion avec for_each : " << float_ms2.count() << " ms " << std::endl;
return 0;
} |
Partager