1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- #include "tbb_local_executor.h"
- template <bool RespectTls>
- void NPar::TTbbLocalExecutor<RespectTls>::SubmitAsyncTasks(TLocallyExecutableFunction exec, int firstId, int lastId) {
- for (int i = firstId; i < lastId; ++i) {
- Group.run([=] { exec(i); });
- }
- }
- template <bool RespectTls>
- int NPar::TTbbLocalExecutor<RespectTls>::GetThreadCount() const noexcept {
- return NumberOfTbbThreads - 1;
- }
- template <bool RespectTls>
- int NPar::TTbbLocalExecutor<RespectTls>::GetWorkerThreadId() const noexcept {
- return TbbArena.execute([] {
- return tbb::this_task_arena::current_thread_index();
- });
- }
- template <bool RespectTls>
- void NPar::TTbbLocalExecutor<RespectTls>::Exec(TIntrusivePtr<ILocallyExecutable> exec, int id, int flags) {
- if (flags & WAIT_COMPLETE) {
- exec->LocalExec(id);
- } else {
- TbbArena.execute([=] {
- SubmitAsyncTasks([=] (int id) { exec->LocalExec(id); }, id, id + 1);
- });
- }
- }
- template <bool RespectTls>
- void NPar::TTbbLocalExecutor<RespectTls>::ExecRange(TIntrusivePtr<ILocallyExecutable> exec, int firstId, int lastId, int flags) {
- if (flags & WAIT_COMPLETE) {
- TbbArena.execute([=] {
- if (RespectTls) {
- tbb::this_task_arena::isolate([=]{
- tbb::parallel_for(firstId, lastId, [=] (int id) { exec->LocalExec(id); });
- });
- } else {
- tbb::parallel_for(firstId, lastId, [=] (int id) { exec->LocalExec(id); });
- }
- });
- } else {
- TbbArena.execute([=] {
- SubmitAsyncTasks([=] (int id) { exec->LocalExec(id); }, firstId, lastId);
- });
- }
- }
- template class NPar::TTbbLocalExecutor<true>;
- template class NPar::TTbbLocalExecutor<false>;
|