2012-11-05 6 views
8

Jestem nowy w Google Go (Golang). Moje pytanie związane jest z tym postem: What exactly does runtime.Gosched do?. Struktura kodu jest kopiowana poniżej. Moje pytanie brzmi: kiedy zmienię liczbę procesorów w GOMAXPROCS, w jaki sposób mogę sprawdzić, ile procesorów jest uruchomionych. Kiedy robię "top", pokazuje proces a.out, który zużywa 100% lub mniej zasobów, nawet gdy GOMAXPROCS ma więcej niż 1. Byłbym wdzięczny za twoją pomoc.Golang: jak zweryfikować liczbę procesorów, na których działa program Go

package main 

import (
    "fmt" 
    "runtime" 
    "sync" 
) 

var wg sync.WaitGroup 

func doTasks() { 
    fmt.Println(" Doing task ") 
    for ji := 1; ji < 100000000; ji++ { 
     for io := 1; io < 10; io++ { 
      //Some computations 
     } 
    } 
    runtime.Gosched() 

    wg.Done() 
} 

func main() { 
    wg.Add(1) 
    runtime.GOMAXPROCS(1) // or 2 or 4 
    go doTasks() 
    doTasks() 
    wg.Wait() 
} 
+0

Na jaki system operacyjny to testujesz? Warto również wiedzieć, z jakiego procesora korzystasz. Nie mogę odtworzyć zachowania. – nemo

+0

cat/etc/* - zwalnia wersję: Red Hat Enterprise Linux Workstation wersja 6.3 (Santiago). System operacyjny to Linux. Procesor to Intel (R) Xeon (R) CPU, X5460 @ 3.16GHz. NumCPU zwraca 8. – user984260

+0

@nemo Program działa idealnie dobrze. Tylko ja byłem ciekawy, jak zobaczyć liczbę procesorów, na których działa – user984260

Odpowiedz

24

Największa liczba procesorów logicznych, w których proces może być uruchomiony w określonym czasie, jest nie mniejsza niż minimum runtime.GOMAXPROCS(0) i runtime.NumCPU().

func MaxParallelism() int { 
    maxProcs := runtime.GOMAXPROCS(0) 
    numCPU := runtime.NumCPU() 
    if maxProcs < numCPU { 
     return maxProcs 
    } 
    return numCPU 
} 
+0

+1 to wygląda na prawidłowe rozwiązanie (lub co najmniej interesujące). Ale czy masz jakieś źródła o braku lepszych i trwalszych sposobów? –

+0

Nie jestem pewien, czy to tylko ja, ale MaxParallelism zwraca 0 na moim 2011 Macbook Air i 8-rdzeniowym serwerze Intela z systemem Debian 7. Moim obejściem jest użycie runtime.NumCPU, który zwraca 4 dla MBA (2 wątki na każdym z 2 rdzeni) i 8 CPU na serwerze (ma 8 rdzeń XEON bez hyperthread). Testowanie wykonane za pomocą programu Go 1.2. –

+0

@PeterKrnjevic: Nie mogę tego odtworzyć. Macbook air 10.9, przejdź do wersji 1.2. –

2

Liczba rdzeni może być określona przez http://golang.org/pkg/runtime/#NumCPU.

Dokumentacja mówi: "NumCPU zwraca liczbę procesorów logicznych na komputerze lokalnym."

+1

Dzięki. Jednak chciałem zapytać, jak poznać liczbę procesorów, na których działa bieżący program. Ta liczba jest mniejsza lub równa NumCPU. – user984260

Powiązane problemy