Gibt es eine Möglichkeit, Valgrind mehrere Prozessoren zu verwenden?
Ich führe eine Engpass-Profilerstellung mit Valgrinds Callgrind durch und bemerke ein signifikant unterschiedliches Ressourcennutzungsverhalten in meiner Anwendung, verglichen mit der Ausführung außerhalb von valgrind / callgrind.
Wenn außerhalb von valgrind ausgeführt wird, werden maximal mehrere Prozessoren ausgeführt, aber in valgrind wird nur eine ausgeführt. Das macht mich besorgt, dass meine Flaschenhälse an verschiedenen Stellen sind und dadurch meine Profilierung ungültig machen.
Laut Valgrind Docs unterstützen sie nicht mehrere Prozessoren:
Die Hauptsache, auf die Sie hinweisen sollten Bezug auf Thread-Programme ist das Ihr Programm wird das Native verwenden Threading-Bibliothek, aber Valgrind Serialisiert die Ausführung so, dass nur eine (Kernel) -Thread wird gleichzeitig ausgeführt. Dieser Ansatz vermeidet das Schreckliche Implementierungsprobleme von Implementierung eines wirklich Multithread Version von Valgrind, aber es bedeutet Diese Thread-Apps werden nur auf einem ausgeführt CPU, auch wenn Sie einen Multiprozessor haben oder Multicore-Maschine.
Valgrind plant die Threads nicht selbst. Es stellt nur sicher, dass nur Ein Thread läuft gleichzeitig mit a einfaches Schließschema Das tatsächliche Thread-Planung bleibt unter Kontrolle des OS-Kernels. Was ist das heißt aber, dass du das bist Programm wird sehr unterschiedlich aussehen Planen, wenn auf Valgrind ausgeführt wird Es funktioniert, wenn es normal läuft. Das ist sowohl weil Valgrind serialisiert die Threads und weil der Code ausgeführt wird so viel langsamer als normal.
Dieser Unterschied in der Planung kann Ursache dafür, dass sich Ihr Programm verhält anders, wenn du irgendeine Art von Nebenläufigkeit, kritisches Rennen, Sperren, oder ähnlich, Bugs. In diesem Fall könnte die Verwendung der Tools in Betracht ziehen Helgrind und / oder DRD, um sie zu verfolgen runter.