2013-02-26 14 views
13

Jeśli piszesz oprogramowanie, w którym klient płaci za liczbę rdzeni procesora używanych przez oprogramowanie, jaki byłby najlepszy sposób osiągnięcia tego w kodzie C++? Moje dotychczasowe badania doprowadziły mnie do korzystania z SetProcessAffinityMask w systemach Windows i sched_setaffinity w systemach POSIX.Ustalanie liczby rdzeni procesowych za pomocą C++

+0

Prawda i szczegółową odpowiedź na swoje pytanie: [1]: http://stackoverflow.com/a/3082553/1848929 – hakiko

+0

@hakiko To pytanie jest o znalezienie się, ile rdzeni istnieją ... – us2012

+2

On Windows, powinieneś rzucić okiem na obiekty pracy: http://msdn.microsoft.com/en-us/library/windows/desktop/ms684161(v=vs.85).aspx mogą zrobić dużo więcej w celu ograniczenia procesów niż powinowactwo. Ale mogą także ograniczyć powinowactwo: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686216(v=vs.85).aspx –

Odpowiedz

0

Myślę, że znalazłeś najlepszą opcję. Ograniczanie liczby wątków nie jest dobrym pomysłem, jeśli chcesz wykorzystać możliwości procesorów wielowątkowych.

+1

"gdzie klient płaci za liczbę rdzeni procesora" już oznacza, że ​​NIE chcesz korzystać z tych możliwości, CHYBA, że klient płaci. – MSalters

2

To interesujące pytanie. Nie sądzę, że mam idealne rozwiązanie, ale ponieważ dotychczas nie było odpowiedzi, zaproponuj następujące:

Jeśli główny fragment pracy w twoim programie jest wykonywany przez jeden typ wątku, po prostu nie Zyskuje więcej wątków roboczych niż pozwalają na to licencje klienta. Ponieważ pojedynczego wątku nie można podzielić na wiele rdzeni, nakłada to sztywny limit.

(Nie sądzę, że ustawienie procesora Powinowactwo procesora jest drogą do wykonania, ponieważ może być łatwo zmienione w czasie wykonywania, ponieważ nie wymaga żadnej inżynierii wstecznej ani stałych modyfikacji systemu, obawiałbym się, że obejście to nie jest wystarczająco "złe", aby uniemożliwić nawet uczciwym klientom wypróbowanie go.)

+0

Ustawianie przydziałów wątków może być również sposobem na to. Jeśli chodzi o ludzi zmieniających powinowactwo procesów w czasie wykonywania, pomyślałem, że od czasu do czasu sprawdzałem powinowactwo za pomocą 'GetProcessAffinityMask' i zgłaszałem wyjątek licencyjny (exit), jeśli zmieniło się od kiedy ustawiłem go w' main'. –