Je suis en train autour de la nouvelle C++11 fils, mais mon test simple a insondable de performances multicœurs. Comme exemple simple, ce programme ajoute quelques carrés de nombres aléatoires.
#include <iostream>
#include <thread>
#include <vector>
#include <cstdlib>
#include <chrono>
#include <cmath>
double add_single(int N) {
double sum=0;
for (int i = 0; i < N; ++i){
sum+= sqrt(1.0*rand()/RAND_MAX);
}
return sum/N;
}
void add_multi(int N, double& result) {
double sum=0;
for (int i = 0; i < N; ++i){
sum+= sqrt(1.0*rand()/RAND_MAX);
}
result = sum/N;
}
int main() {
srand (time(NULL));
int N = 1000000;
// single-threaded
auto t1 = std::chrono::high_resolution_clock::now();
double result1 = add_single(N);
auto t2 = std::chrono::high_resolution_clock::now();
auto time_elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count();
std::cout << "time single: " << time_elapsed << std::endl;
// multi-threaded
std::vector<std::thread> th;
int nr_threads = 3;
double partual_results[] = {0,0,0};
t1 = std::chrono::high_resolution_clock::now();
for (int i = 0; i < nr_threads; ++i)
th.push_back(std::thread(add_multi, N/nr_threads, std::ref(partual_results[i]) ));
for(auto &a : th)
a.join();
double result_multicore = 0;
for(double result:partual_results)
result_multicore += result;
result_multicore /= nr_threads;
t2 = std::chrono::high_resolution_clock::now();
time_elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count();
std::cout << "time multi: " << time_elapsed << std::endl;
return 0;
}
Compilé avec g++ -std=c++11 -pthread test.cpp' sur Linux et un 3core machine, un résultat typique est
time single: 33
time multi: 565
Donc le multi version filetée est plus d'un ordre de grandeur inférieur. J'ai utilisé des nombres aléatoires et un sqrt à prendre l'exemple moins trivial et sujettes à des optimisations du compilateur, donc je suis à court d'idées.
edit:
- Ce problème des échelles plus grand de N, de sorte que le problème n'est pas à court d'exécution
- Le temps pour créer les threads n'est pas le problème. Hors, il ne change pas le résultat de manière significative
Wow j'ai trouvé le problème. En effet, il était rand(). Je l'ai remplacé par un C++11 équivalent et maintenant le moteur d'exécution des échelles parfaitement. Merci à tous!