Ich führe ein einfaches Thread-Testprogramm auf einem Windows-Computer (kompiliert mit MSVS2015) und einem Server mit Solaris 10 (kompiliert mit GCC 4.9.3). Unter Windows bekomme ich erhebliche Leistungssteigerungen, wenn ich die Threads von 1 auf die Anzahl verfügbarer Cores erhöhe; Derselbe Code zeigt unter Solaris 10 jedoch keinerlei Leistungssteigerung.Std :: Async-Leistung unter Windows und Solaris 10
Die Windows-Maschine hat 4 Kerne (8 logische) und die Unix-Maschine hat 8 Kerne (16 logische).
Was könnte die Ursache dafür sein? Ich kompiliere mit -pthread
, und es ist Erstellen von Threads, da es alle "S" es vor dem ersten "F" druckt. Ich habe keinen Root-Zugriff auf dem Solaris-Computer, und von dem, was ich sehen kann, gibt es kein installiertes Tool, mit dem ich die Affinität eines Prozesses anzeigen kann.
Beispielcode:
#include <iostream>
#include <vector>
#include <future>
#include <random>
#include <chrono>
std::default_random_engine gen(std::chrono::system_clock::now().time_since_epoch().count());
std::normal_distribution<double> randn(0.0, 1.0);
double generate_randn(uint64_t iterations)
{
// Print "S" when a thread starts
std::cout << "S";
std::cout.flush();
double rvalue = 0;
for (int i = 0; i < iterations; i++)
{
rvalue += randn(gen);
}
// Print "F" when a thread finishes
std::cout << "F";
std::cout.flush();
return rvalue/iterations;
}
int main(int argc, char *argv[])
{
if (argc < 2)
return 0;
uint64_t count = 100000000;
uint32_t threads = std::atoi(argv[1]);
double total = 0;
std::vector<std::future<double>> futures;
std::chrono::high_resolution_clock::time_point t1;
std::chrono::high_resolution_clock::time_point t2;
// Start timing
t1 = std::chrono::high_resolution_clock::now();
for (int i = 0; i < threads; i++)
{
// Start async tasks
futures.push_back(std::async(std::launch::async, generate_randn, count/threads));
}
for (auto &future : futures)
{
// Wait for tasks to finish
future.wait();
total += future.get();
}
// End timing
t2 = std::chrono::high_resolution_clock::now();
// Take the average of the threads' results
total /= threads;
std::cout << std::endl;
std::cout << total << std::endl;
std::cout << "Finished in " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << " ms" << std::endl;
}
Versuchen Sie einfach, die Deklarationen von 'gen' und' randn' innerhalb von 'generate_randn' zu verschieben, so dass es pro Thread eine RNG-Instanz anstelle eines einzelnen freigegebenen RNG gibt. Ich wäre auch interessiert, die vollständige Verteilung der Laufzeiten pro Thread zu sehen. – zwol
Du hattest recht, es hat gut funktioniert, nachdem ich gen und randn in generate_randn gezogen habe! Fügen Sie es als Antwort hinzu und ich werde es markieren. :) –