Intel® oneAPI Threading Building Blocks
Ask questions and share information about adding parallelism to your applications when using this threading library.
2466 Discussions

__TBB_ASSERT( my_global_top_priority >= a.my_top_priority, NULL );

MLema2
New Contributor I
348 Views
__TBB_ASSERT( my_global_top_priority >= a.my_top_priority, NULL );
I get this assert when doing a parallel_for:
tbb::task_group_context context(tbb::task_group_context::isolated);
context.set_priority(tbb::priority_high);
tbb::parallel_for(range, functor, tbb::auto_partitioner(), context);
Values of local variables:
my_global_top_priority = 1
a.my_top_priority = 2
We have multiple normal threads that might do parallel tasks with either normal or high priority.
Usually, high priority tasks occurs from threads with higher priority. and are meant for fast user input responses.
Call stack looks something like this:
tbb_debug.dll!tbb::assertion_failure
tbb_debug.dll!tbb::internal::market::lower_arena_priority(tbb::internal::arena & a={...}, __int64 new_priority=1, __int64 old_priority=2) Line 459 C++
tbb_debug.dll!tbb::internal::arena::is_out_of_work()
tbb_debug.dll!tbb::internal::custom_scheduler<:INTERNAL::INTELSCHEDULERTRAITS>::receive_or_steal_task(__int64 & completion_ref_count=2, bool return_if_no_work=false) Line 302 + 0x11 bytes C++
tbb_debug.dll!tbb::internal::custom_scheduler<:INTERNAL::INTELSCHEDULERTRAITS>::local_wait_for_all(tbb::task & parent={...}, tbb::task * child=0x0000000002156740) Line 548 + 0x69 bytes C++
tbb_debug.dll!tbb::internal::generic_scheduler::local_spawn_root_and_wait(tbb::task & first={...}, tbb::task * & next=0x0000000002159bc0) Line 629 + 0x35 bytes C++
tbb_debug.dll!tbb::internal::generic_scheduler::spawn_root_and_wait(tbb::task & first={...}, tbb::task * & next=0x0000000002159bc0) Line 536 C++
OurLib.dll!tbb::task::spawn_root_and_wait(tbb::task & root={...}) Line 693 C++
OurLib.dll!tbb::interface6::internal::start_for<...>::run
OurLib.dll!tbb::parallel_for
0 Kudos
4 Replies
MLema2
New Contributor I
348 Views
BTW, ignoring the assert seems to be fine..
0 Kudos
SergeyKostrov
Valued Contributor II
348 Views
...I get this assert when doing a parallel_for:
tbb::task_group_context context(tbb::task_group_context::isolated);
context.set_priority(tbb::priority_high);
tbb::parallel_for(range, functor, tbb::auto_partitioner(), context);
...

Did you have any problems after that? Also, did you try to execute a Release version of your application?

Asserts are displayed in Debug configurations only and sometimesthey are simplywarning a Software Developer that something is possibly wrong.
0 Kudos
Anton_M_Intel
Employee
348 Views
Hi, thank you for the report.
Do you use the most recent version of TBB? Update 2 contains some fixes in the scheduler'sis_out_of_work().
If yes: it supposes we have a race in task priorities implementation which may cause your priority setting to be [temporarly] ignored. Could you please cut a reproducer out from your code and submit it to us? It will greatly help the investigation.
0 Kudos
MLema2
New Contributor I
348 Views
We use TBB 4.0 U2 (tbb40_278oss).
Is there any fixes between theses two updates that could resolve this?
I only got this assertion once while doing heavy stress tests of our applications. I'm not sure I can easily reproduce it. I will do my best to come up with a sample application that raise this assertions.
Meanwhile, if this happens again, that assertion means nothing more than a warning about some temporarily valid but wrong state?
0 Kudos
Reply