CPU στραγγαλισμού σε C ++

ψήφοι
39

Απλώς αναρωτιόμουν αν υπάρχει ένας κομψός τρόπος για να ορίσετε το μέγιστο φορτίο της CPU για ένα συγκεκριμένο νήμα που κάνει εντατική υπολογισμούς.

Αυτή τη στιγμή έχω εντοπίσει το πιο χρονοβόρο θηλιά στο νήμα (το κάνει μόνο συμπίεση) και τη χρήση GetTickCount()και Sleep()με μια μόνιμη τιμές. Κάνει βέβαιος ότι ο βρόχος συνεχίζεται για ένα ορισμένο χρονικό διάστημα και ό, τι κοιμάται για ένα συγκεκριμένο ελάχιστο χρόνο. Είναι περισσότερο ή λιγότερο κάνει τη δουλειά, δηλαδή εγγυάται ότι το νήμα δεν θα χρησιμοποιήσει περισσότερο από το 50% της CPU.
Ωστόσο, η συμπεριφορά εξαρτάται από τον αριθμό των πυρήνων της CPU (τεράστιο μειονέκτημα) και απλά άσχημο (μικρότερο μειονέκτημα :)).
Καμιά ιδέα?

Δημοσιεύθηκε 05/08/2008 στις 08:11
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
17

Δεν γνωρίζω κανένα API για να παίρνουν χρονοδιάγραμμα του OS να κάνει ό, τι θέλετε (ακόμη και αν το νήμα σας είναι σε αδράνεια προτεραιότητας, αν υπάρχουν έτοιμα τα θέματα που δεν υψηλότερης προτεραιότητας, η δική σας θα τρέξει). Ωστόσο, νομίζω ότι μπορείτε να αυτοσχεδιάσετε μια αρκετά κομψή λειτουργία επιτάχυνσης με βάση αυτά που ήδη κάνουν. Ουσιαστικά (δεν έχω μια μηχανή dev των Windows πρακτικό):

Διαλέξτε ένα προεπιλεγμένο χρονικό διάστημα το νήμα θα κοιμηθεί κάθε επανάληψη. Στη συνέχεια, σε κάθε επανάληψη (ή σε κάθε νιοστή επανάληψη, έτσι ώστε η λειτουργία στραγγαλισμός δεν μόνη της να γίνει ένα σημαντικό φορτίο της CPU),

  1. Υπολογίστε το ποσό του χρόνου της CPU νήμα σας χρησιμοποιείται από την τελευταία φορά που η λειτουργία επιτάχυνσης σας ονομαζόταν (Θα καλέσω αυτό το dCPU). Μπορείτε να χρησιμοποιήσετε τις GetThreadTimes () API για να πάρει το χρόνο που το νήμα σας έχει εκτέλεσης.
  2. Υπολογίστε το ποσό του πραγματικού χρόνου που έχει παρέλθει από την τελευταία φορά που η λειτουργία επιτάχυνσης σας ονομαζόταν (Θα καλέσω αυτό το dCLOCK).
  3. dCPU / dCLOCK είναι η χρήση τοις εκατό της CPU (μίας CPU). Αν είναι υψηλότερη από ό, τι θέλετε, αυξήστε το χρόνο του ύπνου σας, αν είναι χαμηλότερη, να μειώσει το χρόνο του ύπνου.
  4. Έχετε ύπνο νήμα για την υπολογιστική χρόνο.

Ανάλογα με τον τρόπο φύλαξης σας υπολογίζει τη χρήση της CPU, μπορεί να θέλετε να χρησιμοποιήσετε GetProcessAffinityMask () για να μάθετε πόσοι επεξεργαστές το σύστημα έχει. dCPU / (dCLOCK * CPUs) είναι το ποσοστό του συνολικού χρόνου CPU διαθέσιμη.

Θα πρέπει ακόμα να πάρει κάποια μαγικοί αριθμοί για την αρχική ώρα του ύπνου και το ποσό αύξησης / μείωσης, αλλά νομίζω ότι ο αλγόριθμος αυτός θα μπορούσε να είναι συντονισμένοι για να κρατήσει ένα νήμα λειτουργεί σε αρκετά κοντά σε ένα καθοριστεί τοις εκατό της CPU.

Απαντήθηκε 06/09/2008 στις 00:33
πηγή χρήστη

ψήφοι
4

Στο Linux, μπορείτε να αλλάξετε την προτεραιότητα τον προγραμματισμό ενός νήματος με ωραίο ().

Απαντήθηκε 05/08/2008 στις 09:03
πηγή χρήστη

ψήφοι
2

Το πρόβλημα είναι ότι δεν είναι φυσιολογικό να θέλει να αποχωρήσει από την αδράνεια της CPU, ενώ έχετε δουλειά να κάνουμε. Κανονικά μπορείτε να ορίσετε μια εργασία στο παρασκήνιο για να IDLE προτεραιότητα, και αφήστε το λειτουργικό σύστημα να χειριστεί τον προγραμματισμό αυτό όλη την ώρα CPU που δεν χρησιμοποιείται από διαδραστικές εργασίες.

Αυτό ακούγεται σαν να μου το πρόβλημα είναι η διαδικασία φύλακα.

Αν το έργο φόντο σας είναι CPU-δεσμευμένη στη συνέχεια θέλετε να λάβει όλα τα αχρησιμοποίητα χρόνο της CPU για το έργο της.

Ίσως θα πρέπει να εξετάσουμε τον καθορισμό του προγράμματος φύλακα;

Απαντήθηκε 06/09/2008 στις 10:01
πηγή χρήστη

ψήφοι
2

Δεν μπορώ να σκεφτώ κανένα σταυρό τρόπο πλατφόρμα για το τι θέλετε (ή οποιοδήποτε εγγυημένο τρόπο τελεία), αλλά όπως μπορείτε να χρησιμοποιείτε GetTickCount ίσως δεν ενδιαφέρονται πολλαπλής πλατφόρμας :)

Θα χρησιμοποιήσετε τις επικοινωνίες ενδοεπικοινωνία και να ρυθμίσετε τις εντατικές διαδικασίες ωραίο επίπεδα για να πάρει ό, τι χρειάζεστε, αλλά δεν είμαι σίγουρος ότι είναι κατάλληλη για την περίπτωσή σας.

EDIT: Συμφωνώ με τον Bernard η οποία είναι ο λόγος που πιστεύω ότι μια διαδικασία και όχι ένα νήμα μπορεί να είναι πιο κατάλληλη, αλλά απλά δεν μπορούσε να ταιριάξει τους σκοπούς σας.

Απαντήθηκε 05/08/2008 στις 08:23
πηγή χρήστη

ψήφοι
0

Μπορεί να είστε σε θέση να αλλάξετε την προτεραιότητα ενός νήματος, αλλά η αλλαγή της μέγιστης αξιοποίησης είτε θα απαιτήσει δημοσκοπήσεις και αμυχές να περιορίσει πόσα πράγματα συμβαίνουν, ή με τη χρήση εργαλείων λειτουργικό σύστημα που μπορεί να θέσει τη μέγιστη αξιοποίηση της διαδικασίας. Ωστόσο, δεν βλέπω καμία περίσταση όπου θα θέλετε να το κάνετε αυτό.

Απαντήθηκε 03/01/2018 στις 18:06
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more