Модифікація алгоритму пулу потоків з багатьма чергами

2023;
: cc. 96 - 102
Автори:
1
Національний університет «Львівська політехніка», кафедра електронних обчислювальних машин

В статті пропонується модифікація алгоритму пула потоків, запропонованого Шоном Парентом на конференції NDC London 2017. Алгоритм, який пропонується, не уступає оригінальному алгоритму по швидкодії та простоті реалізації, і водночас усуває потенційний недолік оригінального алгоритму, який полягає в тому, що при певних обставинах кілька задач можуть виконуватися на одному і тому ж потоці, в той час як інші потоки можуть знаходитися в стані очікування задачі.

Основна ідея, яка запропонована в роботі, полягає у відслідковуванні сумарної кількості задач, які знаходяться в чергах пула потоків. Коли головний потік поміщає нову задачу в якусь із черг, лічильник кількості задач збільшується на одиницю. Коли задача вилучається з черги, лічильник кількості задач зменшується на одиницю. У випадку, коли потік пула хоче отримати задачу, він переглядає черги до тих пір, доки йому не вдасться отримати задачу з якоїсь із черг, або доки лічильник кількості задач не стане рівним нулю. Якщо лічильник кількості задач стає рівним нулю, потік переходить в стан сну до моменту, коли лічильник кількості потоків не стане знову ненульовим. Тоді один із потоків пула прокидається і починає перевіряти черги на наявність задач. Дуже важливим моментом при цьому є зберегти рівномірний розподіл задач по чергах, оскільки це має суттєвий вплив на швидкодію програми.

  1. Amdahl G., The validity of the single processor approach to achieving large-scale computing capabilities, Proceedings of AFIPS Spring Joint Computer Conference, Atlantic City, N.J., AFIPS Press, pp. 483-485.
  2. ISO International Standard ISO/IEC 14882:2020(E) – Programming Language C++. 
  3. David Chase and Yossi Lev, Dynamic circular work-stealing deque, SPAA, pp. 21–28. ACM, 2005. DOI:10.1145/1073970.1073974
  4. K. Agrawal et al. Executing task graphs using work-stealing, IEEE IPDPS, April 2010, pp. 1–12. DOI:10.1109/IPDPS.2010.5470403
  5. Nhat Minh et al., Correct and efficient work-stealing for weak memory models, PPoPP, pp. 69–80. ACM, 2013. DOI:10.1145/2442516.2442524
  6. T. Huang et al., Cpp-Taskflow: Fast task-based parallel programming using modern C++. In IEEE IPDPS, May 2019, pp. 974–983. DOI: 10.1109/IPDPS.2019.00105
  7. C. -X. Lin, T. -W. Huang and M. D. F. Wong, An Efficient Work-Stealing Scheduler for Task Dependency Graph, 2020 IEEE 26th International Conference on Parallel and Distributed Systems (ICPADS), Hong Kong, 2020, pp. 64-71, doi: 10.1109/ICPADS51040.2020.00018
  8. Intel oneAPI Threading Building Blocks. [Elektronnyi resurs]. -URL: https://www.intel.com/content/www/us/en/developer/tools/oneapi/onetbb.html
  9. Sean Parent, Better Code: Concurrency, NDC { London } 2017. [Elektronnyi resurs]. -URL: https://sean-parent.stlab.cc/presentations/2016-08-08-concurrency/2016-0...
  10. Thread Pool Benchmark. [Elektronnyi resurs]. -URL: https://github.com/Red-Portal/thread-pool- benchmark/