2012-01-30 11 views
6

Przechodziłem przez samouczek w języku Java, w którym wspomniano, że faktyczna wielowątkowość nie występuje w komputerze mającym pojedynczy procesor. Wspomniano, że system operacyjny przypisuje określoną ilość czasu procesowi Java, a program planujący wątek JVM wybiera wątki do uruchamiania jednego wątku naraz przez krótki czas.Wielowątkowość Java w laptopie z czterordzeniowym procesorem

Mam laptopa z procesorem czterordzeniowym - możliwe jest szybsze programowanie wielowątkowego programu poprzez uruchomienie jednego wątku w każdym rdzeniu? Powodem, dla którego zadaję to pytanie, jest to, że książka wspomniała, że ​​tylko prawdziwy system wieloprocesorowy może wykonywać wiele czynności jednocześnie.

+1

Następnie dodano znacznik wielowątkowości - to nie jest tylko pytanie skoncentrowane na Javie. Mam nadzieję, że otrzymasz wspaniałe odpowiedzi. – Makoto

+0

Artykuł, który przeczytałeś, pochodzi prawdopodobnie z czasów przed procesorami wielordzeniowymi, więc stwierdza, że ​​tylko komputer wieloprocesorowy może go używać. – Hurda

Odpowiedz

7

Nawet pojedynczy procesor może robić "wiele rzeczy w tym samym czasie" w luźnym sensie, ale nie są one naprawdę równoległe. Możesz uruchomić 100 wątków, aby uruchomić na pojedynczym rdzeniu, a oni otrzymają fragmenty czasu, podczas których każdy z nich może uruchomić kilka instrukcji, tworząc wrażenie, że wszystkie są wykonywane w tym samym czasie.

Jak mówiłem w innym SO postu: multithreading on dual core machine?

Określenie wątków zwykle obejmuje trzy warstwy abstrakcji:

  1. nici Obsługi są wątki rozpoczęte przez aplikacje i są odwzorowane N: M, aby :
  2. jądra nici są nićmi, które obsługiwanych przez system operacyjny odwzorowywane N M do:
  3. Wątki sprzętowe, które są faktycznymi dostępnymi zasobami fizycznymi.

Nitki Java to wątki użytkownika. 4 rdzenie twojego CPU liczą się jako wątki sprzętowe. Ponieważ mapowanie ma wartość N: M między warstwami, można zauważyć, że istnieje kilka wątków użytkowników odwzorowanych na mniejszą liczbę wątków sprzętowych.

Teraz, powiedział to, nie są na ogół dwa rodzaje działań nici, każdy z własnymi dziwactw:

  1. I/O wątków: nici te spędzają większość swojego czasu oczekiwania na odczyt/zapis operacje ze strumienia i są w międzyczasie zablokowane (nie są planowane do wykonania, dopóki nie pojawi się zdarzenie, aby je obudzić). Na procesorze jest światło i wiele z nich może działać jednocześnie, nawet na jednym rdzeniu.
  2. Nić obliczeniowa: ten wątek wykonuje wiele zgrzytnięć i maksymalnie wykorzystuje procesor. Zaczynając więcej niż (2x liczba dostępnych rdzeni), takie wątki obniżą wydajność, ponieważ procesor ma ograniczoną liczbę jednostek funkcjonalnych: jednostki ALU, jednostki FPU itp.

Druga klasa wątków powyżej pozwala naprawdę widzisz korzyści lub uruchamiasz wielowątkowy program java na twoim czterordzeniowym procesorze. Oto prosty przykład programu, który wykonuje kwadratury 1.000.000.000 numerami pierwszy sekwencyjnie, a następnie równolegle przy użyciu puli wątków z 4 Odpowiedź:

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.TimeUnit; 

class ThreadTask implements Runnable { 

    private int total = 0; 

    public ThreadTask(int total) { 
     this.total = total; 
    } 

    @Override 
    public void run() { 
     int value = 0; 
     for(int i = 0; i < total; i++) { 
      value = i * i; 
     } 
    }  
} 

public class Test { 

    public static void main(String[] args) throws InterruptedException { 

     int total = 1000000000; 

     long start = System.currentTimeMillis(); 
     long value = 0; 
     for(int i = 0; i < total; i++) { 
      value = i * i; 
     }  
     long stop = System.currentTimeMillis(); 

     System.out.println((stop - start) + " ms"); 

     ExecutorService exec = Executors.newFixedThreadPool(4); 
     start = System.currentTimeMillis(); 
     for(int i = 0; i < 4; i++) { 
      exec.submit(new ThreadTask(total/4)); 
     } 
     exec.shutdown(); 
     exec.awaitTermination(10, TimeUnit.SECONDS); 
     stop = System.currentTimeMillis(); 

     System.out.println((stop - start) + " ms");  
    } 
} 

Zapraszam do regulacji wartości total czy to działa zbyt szybko . Teraz pracuję na netbooku z Intel Atom, więc nie jest to naprawdę szybkie.

+0

Dzięki Tudor - wypróbujemy to :) –

1

Nawet z jednym procesorem wiele wątków może przyspieszyć działanie programu, wszystko zależy od pracy, którą próbujesz przyspieszyć. Na przykład, jeśli twoje wątki oczekują na IO. Jeśli jest to czysto obliczeniowe, prawdopodobnie chciałbyś ograniczyć swoje wątki do liczby rdzeni.

Zmierz to przetestuj za pomocą eksperymentów.

2

Wielordzeniowy procesor może "prawdziwie" zrównoważyć pracę w aplikacji do liczby posiadanych rdzeni. W twoim przypadku byłoby to 4 wątki. Przeczytaj więcej na temat multi-core a multi-processor na Wikipedia. Mówiąc to, możesz osiągnąć korzyści związane z wydajnością dzięki wielowątkowemu algorytmowi na jednym rdzeniowym procesorze, mimo że masz tylko jeden procesor.

Poprawa wyników uzyskanych przez zastosowanie wielordzeniowych procesora zależy w dużej mierze od użytych algorytmów programowych i ich realizacji . W szczególności, możliwe zyski są ograniczone przez część oprogramowania, która może być zrównoleglona, ​​aby działać równocześnie na wielu rdzeniach ; ten efekt opisuje prawo Amdahla. W najlepszym przypadku, tak zwane kłopotliwe problemy równoległe mogą realizować współczynniki przyspieszenia w pobliżu liczby rdzeni, lub nawet więcej, jeśli problem zostanie rozłożony na tyle, aby zmieścił się w pamięci podręcznej każdego rdzenia, unikając korzystania z znacznie wolniej główna pamięć systemowa. Jednak większość aplikacji nie jest tak bardzo przyspieszana, chyba że programiści zainwestują zbyt wiele wysiłku w ponowne przeanalizowanie całego problemu 2. Zrównoleglenie oprogramowania jest znaczącym, ciągle aktualnym tematem badań.

Zobacz także to pytanie: StackOverflow.

1

Mogę potwierdzić, że na moim laptopie i3 algorytmy działające równolegle pracują prawie dwa razy szybciej niż algorytm szeregowy.

więcej kontekst dodany poniżej ...

te są bardzo algorytmów obliczeniowych bez I/O. Zasadniczo, obliczanie statystyk na N dużych tablicach, gdzie każda z tablic może być wykonana niezależnie. Uważam, że przy użyciu puli wątków 2-4 wątków wszystko daje około tego samego wzrostu prędkości - 2X. Przechodząc do 8 lub więcej wątków, rzeczy zaczynają zwalniać nieco, gdy pojawia się więcej sporów (i zużywają więcej pamięci). Na procesorze z większą liczbą rdzeni wartości te uległyby zmianie.