Napisałem bardzo wątkowe zadanie wielowątkowe, które działa zgodnie z oczekiwaniami na moim czterordzeniowym MacBooku Pro 2012. Obracam go luźno za pomocą 20 nici, a temperatury dochodzą do około 100 ° C, mierzone za pomocą gadżetu Intel Power Gadget przy minimalnym dławieniu.
Zabierz ten sam program i pliki do domu na mojego 13-calowego MacBooka Pro 2016 z dwurdzeniową maszyną i uruchom go. Spodziewam się, że będzie on również utrzymywał 3,3-3,4 GHz, dopóki temperatura nie osiągnie poziomu 100 ° C. Górne polecenie pokazuje zadanie na poziomie 350% (2 rdzenie każdy z podwójnym wątkiem), ale częstotliwość procesora zostaje obcięta do 1,6-1-8 GHz przy temperaturze wynoszącej tylko około 60 ° C, a wentylatory są zupełnie ciche. Jeśli zacznę 4 osobne jedno-wątkowe zadania procesora, maszyna zachowuje się zgodnie z oczekiwaniami, utrzymując 3,3-3,4 GHz, aż osiągnie 100 ° C i wentylatory się rozkręcą. Pytanie brzmi: dlaczego mój procesor jest dławiony?
Oba komputery są aktualne i obsługują te same wersje gcc. Jeśli nawet wezmę plik binarny z działającej maszyny i umieści go na komputerze Mac 2016, będzie miał ten sam problem.
Jeśli uruchomię 3 lub 4 pojedyncze wątki procesora, aby maszyna pracowała na pełnych obrotach, to uruchom program wątkowy, a także spowolni częstotliwość.
Oba komputery mają 16 GB pamięci RAM.
Edytować
Po zabawie z kodem podejrzewam, że dławi się, gdy zadanie tworzy zbyt wiele wątków. W tym programie biorę każdy czytany rekord i tworzę dla niego wątek. Zezwalam tylko na opuszczenie około 20 wątków naraz, więc w żadnym momencie nie ma więcej niż 21 wątków, ale istnieje 14 400 000 rekordów do przetworzenia, więc w ciągu około 30 minut każdy z tych rekordów zostanie przetworzony przez osobny wątek.
Stworzyłem trywialny program pthread, który zassał czas procesora i uruchomiłem 10 z nich. Problem z laptopem działał i rozgrzał się do 95 ° C bez problemów.
Myślę, że przepiszę kod, aby ponownie użyć tego samego wątku zamiast go zniszczyć i uruchomić ponownie.
Zaktualizuj 5/13/17
Po kilku godzinach pracy tworzy teraz tylko n wątków i ponownie je wykorzystuje, co nie pomogło. Poza temperaturą procesora, co spowoduje, że urządzenie zacznie dławić się?
źródło
Odpowiedzi:
Może to być długi cel, ale być może różnica w wydajności pojedynczego rdzenia i / lub wydajności pamięci podręcznej między pakietami procesorów z 2012 i 2016 r. Jest wystarczająco duża, aby rdzenie pozbawione były danych i dławiły się, dopóki nie będą w stanie ponownie pracować?
Zgaduję, ponieważ wskazujesz, że wystarczająca liczba procesów jednowątkowych może działać z pełną prędkością na wszystkich rdzeniach, a prosty program wielowątkowy może działać z pełną prędkością na wszystkich rdzeniach.
To sprawia, że myślę, że jest coś w projekcie programu twojego rzeczywistego obciążenia pracą w porównaniu z testowym obciążeniem wielowątkowym, które nie pozwala procesorom cały czas pracować
źródło
Rozszerzenie jądra /System/Library/Extensions/AppleACPIPlatform.kext kontroluje wiele zabezpieczeń temperatury i procesora. Oczywiście jest już skompilowany w twoim systemie, ale może być dostępny na https://opensource.apple.com (nie mogę go znaleźć, ale rzuciłem mu tylko okiem). Nie zaskoczyłoby mnie, gdyby Apple miał bardzo konserwatywne ustawienia zdolności procesora.
źródło
Ilekroć system operacyjny rozpozna wątki jako nieprzewidywalne i wymknie się spod kontroli, dławi się, aby zachować stabilność sprzętu i systemu, model 2012 zachowuje się inaczej i może zostać zablokowany w najgorszym przypadku. Stało się to ze źle zaimplementowaną kontrolą wątków, moja wina. Po prostu nie uruchamiaj tylu wątków na podwójnym rdzeniu.
źródło
Stało się to ze źle zaimplementowaną kontrolą wątków, moja wina. Po prostu nie uruchamiaj zbyt wielu wątków na dwurdzeniowym procesorze.
źródło