Skip to content
Snippets Groups Projects
This project is mirrored from https://github.com/mantidproject/mantid.git. Pull mirroring updated .
  1. Mar 13, 2020
    • David Fairbrother's avatar
      Re #26703 Fix TBB Threading issue · 42793d09
      David Fairbrother authored
      Fixes the following assertion thrown by TBB:
      
      	Attempt to terminate non-local scheduler instance
      
      This took a significant amount of time to track down due to a number of
      factors. If your looking for a quick fix; set your
      tbb::task_scheduler_init to use thread local storage.
      
      This is caused by using Python multi-processing (in our case for the
      system tests). The process will spawn correctly (Windows), however
      Python will helpfully create seperate thread(s). I assume to observe. In
      this case the task_scheduler_init handle would then belong to one of
      these threads, as the act of importing our Python module would init the
      framework and TBB implicitly.
      
      When the tests run and TBBs scheduling is required it will "sign_on" in
      tbb's governor.cpp to handle scheduling. This works because the
      scheduler_init handle
      is process wide. However internally they then use thread local storage
      (TLS) for tracking the scheduler.
      
      As the main process goes to destruct it assumes that we must have
      a scheduler instance, since at process level we have done the init.
      
      But we cannot see any schedulers since they belong to a different
      thread. We have been getting away with this as the TLS returns NULL
      which effectively nops the destruction. But the assert correctly points
      out were getting this wrong.
      
      Marking each handle to the scheduler as thread local effectively ties
      the destruction of the thread to its init status. For most threads this
      effectively means we create a unique_ptr which isn't used. But for our
      main threads and weird edge case worker threads it keeps the thread
      state consistent.
      
      We've used a unique_ptr since we have an API which allows us to change
      the number of threads TBB can spin up. However, anyone else facing this
      issue would probably be fine with a thread local object allocated on the
      stack.
      42793d09
    • David Fairbrother's avatar
      Updates TBB to 2020U1 . · aab615f0
      David Fairbrother authored
      aab615f0
  2. Mar 12, 2020
  3. Mar 11, 2020
Loading