Rozłożenie wątków na wiele procesorów.

0

Witam wszystkich,

mam następujący problem: w moim programie zawierającym 4 wątki rozkładam obliczenia na 4, ewentualnie 2 procesory. Zrobiłem to poprzez standardowe SetAffinityMask:

if (nCPUs>1)
{
	int processor;
	DWORD_PTR m_mask, result;
	processor = i%nCPUs;
	m_mask = 1<<processor;
	result = SetThreadAffinityMask(threads[i], m_mask);
}

result zwraca poprawny wynik (poprzedni stan, czyli wszystkie procesory aktywne). Jeśli m_mask ustawiam na stała wartość na przykład na 4, wszystko zgodnie z oczekiwaniami uruchamia się na trzecim procesorze
Problem leży w tym, że kiedy dla każdego wątka przypisuje oddzielny procesor, rzeczywiście każdy procesor otrzymuje część pracy jak można by się było spodziewać, jednak sumaryczne obciążenie wynosi tyle, ile wynosiłoby dla jednego procesora. Innymi słowy dla komputera czterordzeniowego, mimo że działają wszystkie procesory, osiągam maksymalnie 25% wydajności a dla dwurdzeniowego 50% wydajności. Czy wie ktoś może czym jest to spowodowane?

używam Visual Studio 2005, Windows XP

Jacek

0

A powiedz mi jaki jest powód, dla którego twój program ma decydować który procesor co robi?
Co na tym zyskujesz? Pozwól systemowi operacyjnemu przypisywać wątki do procesorów, oszczędzisz na kodzie i na takich właśnie problemach.

Przypuszczalnie masz błąd w kodzie, który wymusza by wszystkie wątki działały na jednym procesorze.

0

hmm, ja autora w pełni rozumiem

ma quada, i chce go maksymalnie wykorzystać i nie może, i jeśli tak rzeczywiście jest to jest problem, po cholerę kupować wielordzeniowca jak system i tak procesowi nie pozwala wykorzystać wszystkich procesorów

ja się nie znam na fizycznym wykorzystywaniu wielu procesorów, ale temat mnie zainteresował

0

Masz całkowitą rację. Rzeczywiście w innym miejscu wymuszałem "szeregową" pracę wątków. W tej chwili kod działa tak samo bez znaczenia czy ustawiam affinity czy nie, także system poprawnie sam ustawia obciążenie procesorów.

Mimo wszystko uważam, że ustawienie procesorów do wątków ma sens - jeśli procesy są bardzo wymagające, spowalniają mocno system (nawet przy niskim priorytecie). W tym momencie mozna na 4-rdzeniowcu zastanowić się nad uruchomieniem programu tylko na 3 procesorach.

Pozdrawiam i dziękuję za podpowiedź.
Jacek

0

przy czym i tak nie masz gwarancji, czy system aby nie puscil explorer.exe/etc/ na jednym z prockow ktore sobie wybrales w affinity :)

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