अंतिम अद्यतन:2026-10-12
C++17 parallel STL¶
1. विभिन्न compilers की समर्थन प्रगति¶
विभिन्न compilers का parallel algorithms library समर्थन इस प्रकार है:
https://en.cppreference.com/w/cpp/compiler_support/17#C.2B.2B17_library_features
देखा जा सकता है कि gcc9 के बाद से समर्थन है, clang का समर्थन फिलहाल पूरा नहीं है, मैंने खुद locally test किया और वाकई समर्थन नहीं था।

इसके समर्थित algorithms में ये शामिल हैं:

2. Parallel algorithms library की आवश्यकताएँ¶
gcc9 के बाद parallel algorithms library उपयोग की जा सकती है, हम नीचे दिए gcc-9 documentation को देख सकते हैं।
इसमें एक बहुत ज़रूरी जानकारी है: tbb समर्थन ज़रूरी है।

TBB, Intel द्वारा विकसित parallel programming के लिए एक C++ library है। TBB multicore processors पर parallel software development को सरल बनाने के लिए बनाया गया है, यह abstractions और models का एक सेट उपलब्ध कराता है, जिससे programmers parallel algorithms आसानी से implement कर पाते हैं।
1.C++17 में parallel algorithms library उपयोग करने की पूर्व शर्त tbb इंस्टॉल करना है, तो अगर tbb इंस्टॉल न करें तो क्या होगा?
मैंने खुद test किया — compile और run हो जाता है, बस कोई speedup नहीं मिलती, परिणाम पहले जैसे non-parallel run के समान ही आते हैं।
2.TBB कैसे इंस्टॉल करें?
एक है official tbb, जिसे oneTBB कहा जाता है।
दूसरी है किसी और द्वारा लिखी गई tbb, जिसे tbb कहा जाता है।
अंतर यह है कि इसमें CMake आधारित build system जोड़ा गया है।
अब official संस्करण भी cmake का समर्थन करता है, इसलिए official वाले का उपयोग करने की सलाह है।
Compilation भी बहुत सरल है:
3. उपयोग कैसे करें¶
पारंपरिक STL उपयोग की तुलना में क्या बदलाव हैं?
1. Interface स्तर पर
वास्तव में काफी सरल है, उदाहरण के लिए sort पहले ऐसा था:
अब यह हो गया:
बस execution policy जोड़नी है, तीन विकल्प हैं:
std::execution::seq(sequential execution):- यह डिफ़ॉल्ट execution policy है, यानी अगर आप स्पष्ट रूप से execution policy निर्दिष्ट नहीं करते, तो algorithm sequential execution उपयोग करेगा।
- Algorithm elements को क्रम से एक-एक करके process करेगा, parallel processing शामिल नहीं होगी।
std::execution::par(parallel execution):- इस execution policy के उपयोग से parallel execution enable होगा। Algorithm elements को parallel तरीके से process करने की कोशिश करेगा, multicore processors का पूरा उपयोग करते हुए।
std::execution::par_unseq(parallel और vectorized execution):- यह execution policy algorithm को parallel होने के साथ-साथ vectorization की अनुमति देती है, इसका मतलब है कि SIMD (Single Instruction, Multiple Data) instruction set से parallel vectorization operations किए जा सकते हैं।
std::execution::parके विपरीत,par_unseqparallel processing के साथ-साथ vectorized processing की भी अनुमति देता है, जिससे hardware की parallel और vectorization क्षमताओं का और बेहतर उपयोग होता है।
2. Header files स्तर पर
ज़रूरी है include करना:
अगर tbb के operations हों, तो tbb के header files include किए जा सकते हैं, उदाहरण के लिए: threads की संख्या सेट करना।
3. Compilation स्तर पर
Compile करते समय linking information specify करनी होती है, उदाहरण के लिए:
g++ -O3 -std=c++17 -Wall -Wextra -pedantic -I/usr/local/include/tbb -L /usr/local/lib/ -o main.out main.cc -ltbb
4. Performance testing¶
हाल में sort से जुड़ा काम कर रहा था, merge और sort की performance देखनी थी, इसलिए एक benchmark लिखा, तर्क इस प्रकार है:
-
Serial sort vs parallel sort (par policy)
-
Serial merge vs parallel merge (par policy)
Data range:
नीचे के test परिणाम tbb की डिफ़ॉल्ट thread scheduling policy अपनाएँगे।
तुलना समूह 1: parallel Sort/serial Sort के विस्तृत आँकड़े और speedup


तुलना समूह 2: parallel Merge/serial Merge के विस्तृत आँकड़े और speedup


tbb documentation:
अगर threads की संख्या सेट करनी हो, तो ऐसे किया जा सकता है:
संबंधित विषय¶
- C++ Concurrency in Action रीडिंग गाइड | C++那些事
- C++ deadlock जांच | C++那些事
- C++ SIMD vectorization | C++那些事
- C++ False Sharing और cache line | C++那些事
- GDB multithread All-Stop डीबगिंग | C++那些事
- Helgrind concurrency error detection | C++那些事
- libev event loop का सिद्धांत | C++那些事
- C++ std::thread kernel implementation | C++那些事
- C++ std::thread और jthread | C++那些事
- C++ multithreading की शुरुआत | C++那些事