SethreadAffinityMask () правильное использование? - PullRequest
1 голос
/ 29 марта 2011

У меня 1500 потоков .. Я хочу, чтобы они работали на 12 процессорах ... Для этого я вызываю SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors));где нумпроцессоры = 12.Это правильное использование маски?Он должен быть масштабируемым, то есть если я хочу, чтобы он работал только на 11 процессорах, тогда SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors));, где numprocessors = 11.

Ответы [ 2 ]

5 голосов
/ 29 марта 2011

это правильно.

, но по соображениям производительности и эффективности я предлагаю вам как-то изменить свою модель потоков, чтобы число потоков равнялось количеству ядра выполнения ЦП, тогда эти потоки работают с вашими 1500 задачами / рабочим элементом, который распределяется вашим " диспетчер задач ".

если вы не хотите создавать свой собственный «диспетчер задач», вы можете использовать windows ThreadPool API , который назначает задачу «пулу потоков», управляемому O / S

2 голосов
/ 29 марта 2011

Синтаксически SetThreadAffinityMask (GetCurrentThread (), 1 << (GetThreadId ()% numprocessors)) это правильно, но не рекомендуется использовать сходство только потому, что у вас много потоков и процессоров. это может помешать планировщику и ухудшить производительность. Вы можете использовать это для некоторых потоков, чтобы минимизировать ошибки кэша Отсутствие кэша происходит, когда поток перемещается с одного процессора на другой. </p>

...