5

I am writing an application in java which involves parallel computing. My question is how can I explicitly assign threads to cores? What is the programming logic for it?


Can anyone tell why class Executor is used? Thanks

6
  • How can I explicitly assign threads to cores? can you please elaborate Commented May 4, 2011 at 6:23
  • I have a multithreaded application where I want to control which thread to be assigned to what core Commented May 4, 2011 at 6:25
  • 1
    I think that idea is to explicitly tell the processor cores to execute the particular thread. Commented May 4, 2011 at 6:25
  • Could you please explain how would you use it, it you can do this? Commented May 4, 2011 at 6:25
  • 1
    The OS is better thank you at load balancing because it knows the whole picture Commented May 4, 2011 at 6:34

7 Answers 7

9

You cannot assign threads to cores.

  1. Java7's fork/join framework addresses exactly the same problem. Automatically though (It will be designed for multi-core processors).

  2. What you can do is to set Thread priority to prioritize your threads, if that's what you want to achieve.

  3. JNI might be another direction to export, but an overkill I guess. You can look at Peter Lawrey's Java-Thread-Affinity which uses JNI (I haven't used it).

Sign up to request clarification or add additional context in comments.

9 Comments

Looking forward to fork/join though.
another approach can be setting the processor affinity
You cannot play with processor affinity from Java. JVM handles that for you.
There you go, some JNI code which helps you set CPU affinity: blog.toadhead.net/index.php/2011/01/22/…
@zengr +1. But KLCoder don't do that. It means you'll have to maintain native code, which compiles different under each platform/architecture combination. It is crazy for doing something you don't need (and should) do.
|
5

I think the simple answer here would be you just can't.

2 Comments

Maybe with JNI you can tweak it, but it's really pointless. Agree.
Technically incorrect, you can. It's just that you shouldn't unless you exactly know what you are doing. Example: github.com/OpenHFT/Java-Thread-Affinity
3

See Java Thread Affinity project.

Lock to CPU

try (AffinityLock al = AffinityLock.acquireLock()) {
    // do some work while locked to a CPU.
}

Lock core:

try (AffinityLock al = AffinityLock.acquireCore()) {
    // do some work while locked to a CPU.
}

Comments

2

The OS manages what threads are processed on what core. You will need to assign the threads to a single core in the OS.

For instance. On windows, open task manager, go to the processes tab and right click on the java processes... then assign them to a specific core.

That is the best you are going to get.

you can assign thread priority as per your requirement

Comments

2

I don't think it's easy for you to explicitly assign threads to cores. Maybe you can use native instructions, but I doubt it can be done.

And unless you're doing some special benchmark, you really don't need to. Java threads are backed by native threads, and if the O.S. is modern enough, its kernel will dynamically assign (and re-assign) threads to cores in a way that is certainly better than yours, because it (hopefully) does load balancing.

Start some threads that perform long computations and then see processor usage from a task manager. You'll see many cores being used.

Comments

2

You can't. See this article. The JVM will delegate this to the OS, which will handle it for you.

3 Comments

so it means there is no way I can have a control over that?
Not the JVM, the OS. @KLCoder: maybe with JNI, but you don't need it
First the JVM, then the OS :) I clarified
1

As said, the JVM won't let you. But first, you should ask yourself why you're thinking about assigning threads to cores. This is probably not what you want to do.

The Executor class is used to schedule medium-sized "grains" of computation without incurring the overhead of creating too many threads. You may also want to try using parallel branches for a much more fine-grained scheduling, here are some code samples: http://www.ateji.com/px/codesamples.html

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.