Multicoreproblematik erzeugt fehlerhafte Berechnung



  • hallo,
    ich bin shk an einem frauenhofer institut und habe eine recht knifflige aufgabe von meinem chaf gestellt bekommen.

    problematik:
    eine messkarte liefert werte und auf einem singlecore system läuft das alles prima auch bei höheren abtastraten.
    jedoch bei mutlicoresystem kommt es zu fehlern in der auswertung bei höheren abtastgeschwindogkeiten.

    meine frage lautet dazu: gibt es eine möglichkeit auf treiber ebene einen bestimmten prozessor zu zu weisen? zur auswertung wird nur einer benötigt.
    zum jetztigen zeitpunkt ist das problem, dass keine feste zuweisung passiert und somit die fehler entstehen.

    ich habe leider recht wenig ahnung von der ganzen problematik. auf alle fälle soll es keine optimierung von abarbeitung von prozessen durch multicore erfolgen. stichwort mpi oder openmp.
    eher die feste zuweisung an einen kern. somit müsste man am anfang gleich feststellen, wieviel kerne sind im system vorhanden und dann sagen, dass man gerne nur einen kern davon für das programm benutzen will.

    gibt es diese möglichkeit?

    danke im vorraus für eure hilfe
    gruß
    planet911



  • dazu müssen wir dein os wissen, denn mit reinem c++geht das nicht (c++ kennt gar keine multicore/singlecore etc. 🙂 ).

    Weiter kann ich dir leider auch nicht helfen. Wenn du das os sagst, könnens die mods verschieben ins richtige forum.

    Aber ich kann mir irgendwie nicht voerstellen, dass durch multicores fehelr entstehen sollten. Sicher dass multicore das problem ist und nciht etwas anderes?



  • oh sorry xp natürlich. benötigt ihr sonst noch weitere informationen?

    gruß
    planet911



  • Zumindest geht das im Taskmanager. Dort kann man jedem Prozess beliebige Prozessoren/Kerne zuweisen.



  • ja so haben wir das problem bis jetzt gelöst. dies ist jedoch kein zustand.
    kann man nicht schon auf treiberebene des messkarte festlegen, dass alles nur einen bestimmten kern nutzen darf?

    wie gesagt mein wunschdenken: abfrage der anzahl der kerne und danach feste zuweisung an einen kern.

    gruß
    planet911



  • hallo,
    hab eben nochmal mit meinem chef über die problematik gesprochen.
    also das programm zur auswertung der messwerte läuft prima auf mehrkernsystemen. es liegt am treiber von der messkarte. der macht dann ab einer bestimmten frequenz nur noch unfug.
    somit müsste man diesem besagten treiber beibringen nur einen festen kern zu nutzen. ist dies überhaupt möglich?

    gruß
    planet911



  • Kerne stellen auf Softwareebene letztendlich einen Thread bzw. Prozess dar. Oder anders formuliert, einzelne Threads werden vom System auf die zur Verfügung stehenden Kerne aufgeteilt. Um festzulegen, welche Prozesse bzw. Threads auf welchen Kernen ausgeführt werden dürfen, stehen unter Windows afaik die WinAPI Funktionen SetProcessAffinityMask bzw. SetThreadAffinityMask zur Verfügung. Dazu braucht man im Grunde lediglich das jeweilige Handle zum Prozess bzw. Thread, und kann dann über einen Bit Vektor die gewünschten Kerne maskieren.



  • ich darf mich recht herzlich für die super hilfe im namen meines chefs bei euch bedanken. das mit dem maskieren hat er genau gesucht gehabt und ist selber nicht drauf gekommen. jetzt ist er voller zuversicht, dass er dieses problem aus dem weg räumen kann.

    vielen dank nochmal
    gruß planet911



  • planet911 schrieb:

    hallo,
    ich bin shk an einem frauenhofer institut ...
    planet911

    Heißt es nich "Fraunhofer" ? 😉



  • oh stimmt da ist mir ja ein dummer tippfehler unterlaufen.
    dabei arbeite ich doch schon seit über 18 monaten hier im fraunhofer institut.

    gruß
    planet911



  • Wieso nicht das Problem lösen indem man die Ursache behebt? Die Ursache ist sicher nicht dass mehrere Cores im System vorhanden sind, sondern dass der Treiber für die bzw. das Programm welches mit der Messkarte spricht fehlerhaft ist.

    In Treibern kann man z.B. Spinlocks verwenden um sicherzustellen dass ein 2. Core einem nicht dazwischenpfuschen kann. (Kernelmode Spinlocks gibt's in fast jedem OS welches für multi-CPU Systeme ausgelegt ist, u.A. auch in Windows, Linux, BSD, ...)
    In Usermode Programmen sollte das garnicht nötig sein, solange man nicht mehrere Threads verwenden. Wenn man doch mehrere Threads verwendet gibt es z.B. CRITICAL_SECTIONs bzw. OS-unabhängig formuliert: Mutexen.

    Warum ich eine "echte" Lösung des Problems einem "SetThreadAffinityMask" Hack vorziehen würde: im Prinzip kann jeder Fehler der dich im Usermode mit 2 Cores erwischen kann auch mit einem Core zuschlagen. Für viele Probleme die im Kernelmode zuschlagen können gilt das ebenso. Der Umstand dass das Programm mit nur einem Core Problemlos fehlerfrei zu laufen scheint kann einfach darauf zurückzuführen sein dass solche Fehler auf Single-Core Systemen viel viel seltener "zuschlagen" (was eine bekannte Eigenschaft bestimmter Threading-bezogener Fehler ist).



  • ypu dem stimme ich zu. da du von abtastfrequenzen sprachst. ist es möglich, dass der treiber intern den timestamp counter des prozessors zur zeitmessung benutzt? wenn ja, dann müsste dies gefixt werden, da der TSC nur noch müll in multicore und multiprozessorsystemem erzeugt 🙂



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten