Git Product home page Git Product logo

Comments (4)

progval avatar progval commented on August 17, 2024 1

I removed inner parallelism instead, it was easier to implement and didn't have a significant impact on performance in my workload.

Thanks again for your help

from rayon.

Alphare avatar Alphare commented on August 17, 2024

Reproduced on an AMD Ryzen 9 7950X, since @progval was worried about their CPU being bugged. ;)

Add this to the top of the file for use with cargo play:

//# stderrlog = '*'
//# thread_local = '*'
//# rayon = '*'

from rayon.

cuviper avatar cuviper commented on August 17, 2024

This is an instance of #592 -- the call to par_sort may lead to work-stealing while it waits for sub-tasks to finish, and that may steal another piece of your task that wants to use that mutex, making you re-entrant.

As a workaround, maybe your TLS can have an Option<Vec<T>> for the buffer that you take out while you're working with it, rather than holding the Mutex locked? Then store it back as Some when you're done. When re-entrancy finds it None, you can allocate a new one instead. Maybe you can even keep Vec<Vec<T>> to save multiple allocations just in case, with pop to use and then push it back (or push the new one).

(I'm assuming the buffer is to save allocation time, not needing re-used data between instances.)

from rayon.

progval avatar progval commented on August 17, 2024

This is an instance of #592

Ouch. I noticed that issue but assumed I wouldn't be affected because of the thread-specific mutexes.

may lead to work-stealing while it waits for sub-tasks to finish

Indeed, that matches experience of the deadlocks often occurring toward the end of the execution.

As a workaround, maybe your TLS can have an Option<Vec> for the buffer that you take out while you're working with it, rather than holding the Mutex locked? Then store it back as Some when you're done. When re-entrancy finds it None, you can allocate a new one instead.

Makes sense. This should be pretty rare so the overhead won't be too much. (I'll need to keep the mutexes instead of UnsafeCells I initially used, though.)

Thanks!

(I'm assuming the buffer is to save allocation time, not needing re-used data between instances.)

Correct, my actual code .clear()s it after sorting.

from rayon.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.