Wykorzystanie dwóch rdzeni procesora

0

Witam!

Pisze program w Delphi, który wykonuje pewne obliczenia. Pracuje na procesorze dwurdzeniowym. Pomimo, iż program działa na "pełnych" obrotach, widzę, że wykorzystuje tylko jeden rdzeń, bo komputer obciażony jest na niecałe 50 %. Okno z programem mogę "normalnie" przesuwać, program nie jest blokowany.

Spróbowałem obliczenia rozbić na dwa wątki i dwa takie wątki utworzyłem. Myślałem, że może Windows sam jeden wątek przekieruje do jednego rdzenia, a drugi do drugiego. Niestety, nadal procesor pracował na 50%, także nic nie przyspieszyło. Tyle, ze program był już blokowany i nawet okna nie dało się przesunąć. (aczkolwiek Windows normalnie działał, i inne programy mogłem normalnie uruchmiać).

Mam zatem pytanie. Jak napisać np. dwa wątki, ale tak, by korzystały z obu rdzeniów. Lub tez - jak zmusić procek do pracy na pełnych obrotach, na 100%?

Z góry dzięki za pomoc.

0

google... http://msdn2.microsoft.com/en-us/library/ms686247.aspx

@rotten: autor wątku napisał "dwa takie wątki utworzyłem", więc to Ty się nie wysiliłeś uważnym przeczytaniem opisu jego problemu. poza tym jakie kolejne procesy? nowy wątek nie oznacza nowego procesu.

0

coś pan ŁF się nie wysilił.
po prostu musisz tworzyć dwa(lub więcej) wątki w swojej aplikacji, co doprowadzi do tego, że system zacznie prowadzić kolejne procesy, a on już będzie wiedział, co robić, aby procesor wykorzystał drugi rdzeń ;)

0

Muszę przyznać, że nie wiele z tego rozumiem.

If the new thread affinity mask does not specify the processor that is currently running the thread, the thread is rescheduled on one of the allowable processors.

Ja to rozumiem, że ustawienie bitów dla "affinity mask" oznacza, które procesory mogą dany proces wykonywać. W przypadku braku ustawienia tych wartości thread, jest automatycznie przydzielony na jeden z dostępnych procesorów.

Bardzo proszę pana ŁF o rozwianie wątpliwości i rozjaśnienie naszych umysłów.
Między innymi jakie wartości podać w dwThreadAffinityMask.

edited:

Znalazłem coś takiego:

ProcessAffinity = 1 ' this sets the process to only run on CPU 0
' for CPU 1 only use 2 and for CPUs 1 & 2 use 3

Czyli żeby używać cpu 1 i 2 trzeba ustawić wartość 3?

edited again:

Po kolei na fotce:
dwThreadAffinityMask 1.2.3.4

user image

W przypadku wartości 1 pracuje rdzeń 1, przy 2 obciążony jest 2.
Przy wartościach 3 lub 4 obciażenie jest dzielone, ale nierównomiernie i nie da się osiągnąć 100% mocy procesora. Zawsze obciążenie oscyluje przy 50%, co nie daje sposobności wykorzystania pełnej mocy dwu lub więcej rdzeni.

Panie ŁF czekamy na jakieś sugestie...

0

tak, każdy z bitów w masce odpowiada procesorowi/rdzeniowi na którym dany wątek może pracować; jeśli podana kombinacja bitów jest nieprawidłowa (chcesz pracować na trzecim procku, a masz tylko dwa), to system przyznaje procesory po swojemu.
jeśli ustawiasz 3, to pozwalasz wątkowi na pracę na pierwszym i drugim procku, czyli w Twoim wypadku jest to bez sensu, bo taki sam efekt dla dwóch rdzeni uzyskasz standardowo. dla 4 podajesz nieistniejący u Ciebie trzeci procesor, więc system przydziela istniejące procki według własnych reguł (ergo tak samo jak dla wartości 3 lub 0).

tworzysz dwa wątki, pierwszemu przyznajesz rdzeń #1 (argument dla funkcji = 1), drugiemu #2 (argument dla funkcji = 2).

1 użytkowników online, w tym zalogowanych: 0, gości: 1