pisa icon indicating copy to clipboard operation
pisa copied to clipboard

Single threaded execution requires"0" threads

Open JMMackenzie opened this issue 4 years ago • 4 comments

This was introduced via #387 - The problem is that the documentation for TBB states that passing a parameter n to max_allowed_parallelism will result in n-1 worker threads operating: https://software.intel.com/en-us/node/589744

However, the rules state that passing n = 1 will result in serial processing. Our logic automatically increments the thread count by 1, meaning that serial processing is available but must be conducted by passing --threads 0 to each program. This seems confusing to users.

My solution would be to increment the passed value only if it exceeds 1. What do you guys think?

JMMackenzie avatar Jun 25 '20 04:06 JMMackenzie

@elshize and @amallia

JMMackenzie avatar Jun 25 '20 04:06 JMMackenzie

So just to clarify: in TBB, passing 1 makes it run sequentially, while passing 2 makes it run concurrently but with 1 worker, therefore kind of sequentially, too. Do I understand this right?

If so, then yeah, I would say if 1 then leave 1, and if > 1, then increase by 1. We should extract this logic to a function to have it only in one place. Maybe we can add another method to args::Threads called max_allowed_parallelism that will do that automatically. Then, we could use it like:

tbb::global_control control(
    tbb::global_control::max_allowed_parallelism,
    app.max_allowed_parallelism()
);

elshize avatar Jun 25 '20 12:06 elshize

See, this is the confusing part. i believe that is correct, but I am not sure why they would allow n = 2 to run the same as n = 1 -- it's kinda unclear from the docs...

JMMackenzie avatar Jun 26 '20 00:06 JMMackenzie

See, this is the confusing part. i believe that is correct, but I am not sure why they would allow n = 2 to run the same as n = 1 -- it's kinda unclear from the docs...

It might not be the same. It could be that n = 2 just runs with 1 worker, while n = 1 runs a fully sequential implementation (special case) without spawning any additional threads. This kind of makes sense conceptually. n = 2 in fact would use 2 threads, but only one of them is the worker (so same as n > 2). It just makes no sense to actually run anything with n = 2 is all (although spawning an additional worker thread is negligible in most cases).

Then again, I can't be sure I'm interpreting it correctly.

elshize avatar Jun 26 '20 00:06 elshize