Great performance achievement! > I've pushed a new branch "multithreading" into git. There are 3 > changes right now: > 1) Don't recreate thread pool > 2) Analyze sentences in threads > 3) Optimize some code on main thread (as all coordination goes through > a main thread it is a bottleneck and any improvement there helps a > lot) > > On my profiling case (big text file) the performance improvement is ~40%: > < Time: 321253ms for 610758 sentences (1901.2 sentences/sec) > --- >> Time: 241689ms for 610758 sentences (2527.0 sentences/sec) > > The main thread now only takes ~6%, pretty much almost all of it in > sentence tokenizer (according to jmc). > My 4 cores on i3 now idle ~50% down from ~60%. Much better though not > perfect. > > It looks like if we want to make it truly paralellized there are two > things to do: > 1) tokenize sentences in parallel - this probably is not trivial > 2) streamline the whole process: right now we're reading the file, > sentence tokenizing happens in main thread, then we analyze sentences > in threads (split by sentences), then main thread collects the > results, then we check rules in threads (split by rules), then main > collects the results - we would need to remove these "checkpoints" on > main thread to make it truly paralellized (may be when we switch to > Java 8 we could use its streams to simplify this) > > I didn't add any unit tests as there were no new API or functionality > and existing unit tests pass and my big test on 7 million word text > does not produce any regression. > > Please take a look and let me know if this works for you and if > there's anything else we need to do to merge this into master. > > Andriy > > 2015-02-12 22:35 GMT-05:00 Andriy Rysin <ary...@gmail.com>: >> So I've played with this a bit today and here's what I found: >> with 3 relatively small changes: >> 1) reuse thread pool rather that recreate it every time (this probably >> least important from performance point of view but it's easier to >> profile 4 worker threads than hundreds) >> 2) run sentence analyzer in parallel (using same pool as for rules) >> 3) start one callable for each rule check instead of group of rules - >> this way we spread the check more evenly (should help if e.g. rules in >> one group take much longer than the other) >> >> I was able to get the cpu utilization in multi-threaded LT from 40% to >> 60% and the time to check text of 7 million words went went down by >> 20% (1900 sentences/sec before, 2378 after). >> >> There's still seem be to room for improvement, I can see two things: >> 1) run sentence tokenizer in parallel as well (ideally everything >> after reading paragraph should be parallel) - LT still spends ~13% >> time in main thread which means it can make other threads starve >> 2) stream the line end-to-end unit of work into one callable so we >> don't have to wait between tokenizing, analyzing, and checking; the >> problem here seems to be that we can only split sentence analyzing by >> sentences but for rules we split by rules. We need to check if >> splitting rule check by sentences performs worse than when split by >> rules (but if it performs good we can get rid of rule group filter >> problem). >> >> There was one interesting side effect though: when I split each rule >> into callable there was a regression for rule group filter. It seems >> if we split the rules the group filter does not work. But >> theoretically current code can fail here too: if two rules are in the >> same rule group and have same result but we split those two rules in >> separate threads the rule group filter will not work. I must say I >> didn't run any tests to proove this theory and the changes of this >> happening are low (at least with big number of rules and low cpu >> count) it should still be possible. >> >> I'll do a bit more research when I have time. >> >> Andriy >> >> 2015-02-11 7:39 GMT-05:00 Daniel Naber <daniel.na...@languagetool.org>: >>> On 2015-02-11 05:07, Andriy Rysin wrote: >>> >>>> 1) it seems like we're currently creating and destorying thread pool >>>> every time we check sentences, would it not make more sense to create >>>> pool once and keep threads in the pool and reuse them? >>> >>> I think so. The number of threads should then probably be specified via >>> constructor, not via a set method, so it cannot be changed. >>> >>>> So I am wondering if somebody can shed a bit more light on what are >>>> the critical parts that are not thread-safe and is it worth exploring >>>> if they can be paralellized or it's too much work for not much gain? >>> >>> I don't think there's a better way than carefully looking at the code >>> to >>> make sure it's thread-safe *and* have extensive tests that run with >>> several threads (not as active unit tests, as they run too long). But I >>> think it makes sense to make more code run in parallel. >>> >>> Regards >>> Daniel >>> >>> >>> ------------------------------------------------------------------------------ >>> Dive into the World of Parallel Programming. The Go Parallel Website, >>> sponsored by Intel and developed in partnership with Slashdot Media, is >>> your >>> hub for all things parallel software development, from weekly thought >>> leadership blogs to news, videos, case studies, tutorials and more. >>> Take a >>> look and join the conversation now. http://goparallel.sourceforge.net/ >>> _______________________________________________ >>> Languagetool-devel mailing list >>> Languagetool-devel@lists.sourceforge.net >>> https://lists.sourceforge.net/lists/listinfo/languagetool-devel > > ------------------------------------------------------------------------------ > Dive into the World of Parallel Programming. The Go Parallel Website, > sponsored by Intel and developed in partnership with Slashdot Media, is > your > hub for all things parallel software development, from weekly thought > leadership blogs to news, videos, case studies, tutorials and more. Take a > look and join the conversation now. http://goparallel.sourceforge.net/ > _______________________________________________ > Languagetool-devel mailing list > Languagetool-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/languagetool-devel >
------------------------------------------------------------------------------ Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration & more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=190641631&iu=/4140/ostg.clktrk _______________________________________________ Languagetool-devel mailing list Languagetool-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/languagetool-devel