Proces pobierania CPU TSC, szczególnie w środowisku wielordzeniowym i wieloprocesorowym
W świecie Linuksa, aby uzyskać precyzyjny zegar / zegary z nano sekundami, można użyć:
#include <sys/time.h>
int foo()
{
timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
//--snip--
}
Ta odpowiedź sugerujeasm
podejście do bezpośredniego zapytania o zegar procesora za pomocąRDTSC
instrukcja.
W wielordzeniowej, wieloprocesorowej architekturze, jak synchronizuje się zegar / wartość zegara w wielu rdzeniach / procesorach? Moje rozumienie polega na tym, że odbywa się tam nieodłączne szermierka. Czy to zrozumienie jest prawidłowe?
Czy możesz zasugerować jakąś dokumentację, która wyjaśniłaby to szczegółowo? Jestem zainteresowany mikroarchitekturą Intel Nehalem i Sandy Bridge.
EDYTOWAĆ
Ograniczenie procesu do pojedynczego rdzenia lub procesora nie jest opcją, ponieważ proces jest naprawdę ogromny (pod względem zużycia zasobów) i chciałby optymalnie wykorzystać wszystkie zasoby w maszynie, które obejmują wszystkie rdzenie i procesory.
Edytować
Dziękujemy za potwierdzenie, że TSC jest zsynchronizowany między rdzeniami i procesorami. Ale moje pierwotne pytanie brzmi: w jaki sposób ta synchronizacja została wykonana? czy to jakiś rodzaj szermierki? czy znasz jakąkolwiek publiczną dokumentację?
Wniosek
Dziękujemy za wszystkie dane wejściowe: Oto wniosek na tę dyskusję: TSC są zsynchronizowane przy inicjalizacji przy użyciu RESETU, który odbywa się na rdzeniach i procesorach w systemie wieloprocesorowym / wielordzeniowym. A potem każdy rdzeń jest sam. TSC są utrzymywane niezmiennie za pomocą pętli fazowej, która normalizowałaby zmiany częstotliwości, a tym samym zmiany zegaraw danym rdzeniu i tak TSC pozostaje zsynchronizowany między rdzeniami i procesorami.