Sehr schneller Rechner - erkennen von mehreren Prozessoren

  • Hallo,

    ich habe das Glück an einem sehr schnellen Rechner arbeiten zu dürfen.
    Bisher konnte ich über das angehängte Skript erfolgreich die Anzahl an Cores abfragen.
    Das reicht nun aber nicht mehr, da ich auch die Anzahl an Prozessoren und somit die Gesamtanzahl an Cores benötige.
    Habt ihr eine Idee, wie man Abfragen kann ob es noch eine CPU1 (oder so ähnlich) gibt?
    Vielen Dank.

    Code
    func GetNumberOfCores()
    	$oWMI = ObjGet("WINMGMTS:\\.\ROOT\CIMV2")
    	$colProcs = $oWMI.ExecQuery("select * from Win32_Processor where DeviceID='CPU0'")
    	For $oProc In $colProcs
    		Dim $strInfoCPU = ""
    	Next
    	return $oProc.NumberOfCores
    EndFunc
  • Prüfe doch (Stichwort For-Schleife) die verschiedenen CPUs.

    Code
    select * from Win32_Processor where DeviceID='CPU0'
    select * from Win32_Processor where DeviceID='CPU1'
    select * from Win32_Processor where DeviceID='CPU2'
    ...


    Gibt es eine Zahl nicht, so gibt die Funktion einen Fehler aus
    und diesen musst du nun abfangen.
    Müsste doch eig. so gehen, oder?

    Edit: Ich weiß jetzt nicht genau, wie diese DB aufgebaut ist. Hättest du vllt ein Muster?

    [autoit]


    Func Ulam($n)
    Return 1
    EndFunc

    [/autoit]


    Rekursion FTW :D

    Einmal editiert, zuletzt von Nathax (13. Juli 2012 um 18:55)

  • Hallo,

    ja vermutlich funktioniert das, wenn man es richtig macht.

    Wenn ich CPU0 und CPU1 abfrage, dann bekomme ich die richtige Antwort.
    Wenn ich spasseshalber CPU2 abfrage, dann bekomme ich sogar einen RuntimeError:

    >"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "E:\Sandbox\SYSB_FRM_SIT\sources\comps\ats\pc\_test\APOLLO\APOLLO.au3"
    E:\Sandbox\SYSB_FRM_SIT\sources\comps\ats\pc\_test\APOLLO\APOLLO_Load_Save_ini.au3 (334) : ==> Variable must be of type "Object".:
    return $oProc.NumberOfCores
    return $oProc^ ERROR

    Was kann ich dagegen tun?

  • [autoit]

    MsgBox(0,0, GetNumberOfCores())
    func GetNumberOfCores()
    $oWMI = ObjGet("WINMGMTS:\\.\ROOT\CIMV2")
    $colProcs = $oWMI.ExecQuery("select * from Win32_Processor where DeviceID='CPU0'")
    For $oProc In $colProcs
    Dim $strInfoCPU = ""
    Next
    If IsObj($oProc) Then
    return $oProc.NumberOfCores
    Else
    return "Not available"
    EndIf
    EndFunc

    [/autoit]
    [autoit]


    Func Ulam($n)
    Return 1
    EndFunc

    [/autoit]


    Rekursion FTW :D

  • Probiers mal so:

    Spoiler anzeigen
    [autoit]

    $a_Ret = GetNumberOfCores()

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, "", "Prozessoren: " & $a_Ret[0] & @CRLF & _
    "Kerne: " & $a_Ret[1] & @CRLF & _
    "HT-Kerne: " & $a_Ret[2])

    [/autoit] [autoit][/autoit] [autoit]

    Func GetNumberOfCores()
    Local $o_WMI = ObjGet("WINMGMTS:\\.\ROOT\CIMV2")
    Local $a_Ret[3]

    [/autoit] [autoit][/autoit] [autoit]

    For $o_Proc In $o_WMI.ExecQuery("select NumberOfCores, NumberOfLogicalProcessors from Win32_Processor")
    With $o_Proc
    $a_Ret[0] += 1
    $a_Ret[1] += .NumberOfCores
    $a_Ret[2] += .NumberOfLogicalProcessors
    EndWith
    Next
    Return $a_Ret
    EndFunc

    [/autoit]

    Edit: Ich weiß jetzt nicht genau, wie diese DB aufgebaut ist. Hättest du vllt ein Muster?

    Das ist die WMI. Dafür gibt es eine eigene API welche sich vorwiegend über eine SQL-Artige Syntax (genauer WQL) verwenden lässt.
    Anhaltspunkte welche Daten wo zu finden sind wäre in erster Linie die WMI-Referenz oder noch besser das WMI-Scriptomatic-Tool.

    2 Mal editiert, zuletzt von AspirinJunkie (13. Juli 2012 um 19:22)