SethreadAffinityMask() правильное использование?
У меня 1500 потоков.. Я хочу, чтобы они работали на 12 процессорах... Для этого я звонюSetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors))
; где нумпроцессоры =12. Это правильное использование маски? Он должен быть масштабируемым, то есть если я хочу, чтобы он работал только на 11 процессорах, то SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors));
где нумпроцессоры =11.
2 ответа
Синтаксически SetThreadAffinityMask(GetCurrentThread(),1<< (GetThreadId ()% numprocessors)) это правильно, но не рекомендуется использовать сходство только потому, что у вас много потоков и процессоров. это может помешать планировщику и ухудшить производительность. Вы можете использовать это для некоторых потоков, чтобы минимизировать потери в кеше. Отсутствие кэша происходит, когда поток перемещается с одного процессора на другой.
Правильно.
но из соображений производительности и эффективности, я предлагаю вам каким-то образом изменить модель потоков, чтобы число потоков равнялось количеству ядра выполнения ЦП, тогда эти потоки работают с вашими 1500 задачами / рабочим элементом, который распределяется вашим "диспетчером задач".,
если вы не хотите создавать свой собственный "диспетчер задач", вы можете использовать Windows ThreadPool API, который назначает задачу "пулу потоков", управляемому O/S