I have a C # project where I need to both access the current workload of my processor, and make sure that I run certain code on each processor core. My problem is that accessing the workload of my processor seems to prevent me from properly assigning a thread affinity mask. I have code here that illustrates the problem:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using System.Diagnostics; namespace KernelAffinitySpike { class Program { [DllImport("kernel32.dll", SetLastError = true)] private static extern UIntPtr SetThreadAffinityMask(IntPtr hThread, UIntPtr dwThreadAffinityMask); [DllImport("kernel32.dll", SetLastError = true)] private static extern IntPtr GetCurrentThread(); private static PerformanceCounter cpuUsage; private static UIntPtr oldMask, newMask, testMask;
Running this code gives the following output:
Pre: thread affinity: 3 Pre: all kernels accessible Post: thread affinity: 2 Post: some kernels not accessible: 1
So it seems that calling cpuUsage.NextValue somehow changes the thread merge mask, and also makes it impossible to change the mask to 1. It makes sense that the Nextvalue call should interact with the stream affinity mask in some way, if it aggregates the performance count from each kernels, but I canβt understand why this should affect future changes to the thread merge mask. Does anyone have an explanation or workaround for this problem?
Boris source share