views:

146

answers:

3

Hi guys this question might seem weird, but I'm using the Haptek People Putty player for my C# application and I've seen people say in the forums that it doesn't work well with a multicore processor. My application runs well on my Core 2 Duo laptop but it lags a lot when I try running it on a Quad Core desktop. I was thinking of investigating this for myself and in that case, I would have to force my application to run on a single core. Is that possible in C#? Thanks!

+1  A: 
  • Not really possible IN C#. Well, no way i know off. You need interop, with that it works.

  • Are you using multiple threads? If not - hm - sorry - not a lot you can do. Standard UI applications are not using multiple cores anyway.

Basically, applications not using Threads (Work items use threads) are inherently single core anyway.

TomTom
My application doesn't use multiple threads. The Haptek People Putty player just provided a DLL so I don't know what it actually does inside. I don't know if they have multiple threads or what not. I guess the problem would lie there since I don't have access to their code :(
Paul
I would agree on that. Could be the hosting of them. You are declaring STA Threading as the VS templates do?
TomTom
Yup that's right
Paul
+2  A: 

If the application is single-threaded, it will not take advantage of multiple cores. However, it is possible that the kernel can bump the thread around between cores. I doubt that this is the cause of your performance problems.

If you would like to tie the thread down to a single core (not sure if this can be guaranteed), you might want to check out the System.Diagnostics.ProcessThread.ProcessorAffinity property, although I have never used it myself.

Ani
Thanks Ani, I'll try to see if I can use that
Paul
Hey Ani, setting the ProcessorAffinity got it working! Thanks! :)
Paul
+1  A: 

Where a Process variable proc holds the process you care about (Process.GetCurrentProcess() for the running Process, obtaining it from GetProcesses() or GetProcessesByName() etc. for another process. Then:

foreach(ProcessThread pt = proc.Threads[0])
{
   pt.IdealProcessor = 0;
   pt.ProcessorAffinity = (IntPtr)1;
}

IdealProcessor is a zero-based identity of a single core. ProcessorAffinity is a bitmask, so 1 allows core zero, 2 allows core one, 3 allows cores zero and one, 4 allows core three, and so on.

I would test this thoroughly. Chances are very strong that this will actually damage your performance, in reducing the ability to make use of different cores, which is after-all generally an advantage.

Jon Hanna
Thanks Jon! I also tried doing this yesterday and it worked for my application. You're right it will hinder performance but it's the only way I could force People Putty to work :( Actually the program works with dual core processors, but since I ran it on a quad core it really slowed down. Now that I got that down to 2, it seems to be working good enough.
Paul