विषय पर बढ़ें

अंतिम अद्यतन: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 किया और वाकई समर्थन नहीं था।

fea

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

all std

https://en.cppreference.com/w/cpp/experimental/parallelism

2. Parallel algorithms library की आवश्यकताएँ

gcc9 के बाद parallel algorithms library उपयोग की जा सकती है, हम नीचे दिए gcc-9 documentation को देख सकते हैं।

https://gcc.gnu.org/gcc-9/changes.html

इसमें एक बहुत ज़रूरी जानकारी है: tbb समर्थन ज़रूरी है।

tbb req

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 कहा जाता है।

https://github.com/oneapi-src/oneTBB

दूसरी है किसी और द्वारा लिखी गई tbb, जिसे tbb कहा जाता है।

https://github.com/wjakob/tbb

अंतर यह है कि इसमें CMake आधारित build system जोड़ा गया है।

अब official संस्करण भी cmake का समर्थन करता है, इसलिए official वाले का उपयोग करने की सलाह है।

Compilation भी बहुत सरल है:

mkdir build && cmake ..
make -j8
make install

3. उपयोग कैसे करें

पारंपरिक STL उपयोग की तुलना में क्या बदलाव हैं?

1. Interface स्तर पर

वास्तव में काफी सरल है, उदाहरण के लिए sort पहले ऐसा था:

std::sort(begin, end, comp);

अब यह हो गया:

std::sort(exe_policy, begin, end, comp);

बस execution policy जोड़नी है, तीन विकल्प हैं:

  1. std::execution::seq (sequential execution):
  2. यह डिफ़ॉल्ट execution policy है, यानी अगर आप स्पष्ट रूप से execution policy निर्दिष्ट नहीं करते, तो algorithm sequential execution उपयोग करेगा।
  3. Algorithm elements को क्रम से एक-एक करके process करेगा, parallel processing शामिल नहीं होगी।
  4. std::execution::par (parallel execution):
  5. इस execution policy के उपयोग से parallel execution enable होगा। Algorithm elements को parallel तरीके से process करने की कोशिश करेगा, multicore processors का पूरा उपयोग करते हुए।
  6. std::execution::par_unseq (parallel और vectorized execution):
  7. यह execution policy algorithm को parallel होने के साथ-साथ vectorization की अनुमति देती है, इसका मतलब है कि SIMD (Single Instruction, Multiple Data) instruction set से parallel vectorization operations किए जा सकते हैं।
  8. std::execution::par के विपरीत, par_unseq parallel processing के साथ-साथ vectorized processing की भी अनुमति देता है, जिससे hardware की parallel और vectorization क्षमताओं का और बेहतर उपयोग होता है।

2. Header files स्तर पर

ज़रूरी है include करना:

#include <algorithm>
#include <execution>

अगर 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:

BENCHMARK(BM_ParallelSort)->Arg(16384)->Arg(16384000)->Arg(163840000);  

नीचे के test परिणाम tbb की डिफ़ॉल्ट thread scheduling policy अपनाएँगे।

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

sort parallel

sort parallel sp

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

merge parallel

merge parallel sp

tbb documentation:

https://oneapi-src.github.io/oneTBB/index.html

अगर threads की संख्या सेट करनी हो, तो ऐसे किया जा सकता है:

#include <tbb/tbb.h>

tbb::task_scheduler_init init(16);

संबंधित विषय

टिप्पणियाँ