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

Другие вопросы по тегам