तो ऐसा कोई कारण (पठनीयता के अलावा अन्य) pthreads से अधिक OpenMP उपयोग करने के लिए है:
यह पेज देखते हैं?
माइक तरह का इस पर भी चर्चा:
OpenMP भी है कि में पोर्टेबिलिटी में इसी तरह के फायदे हैं विभिन्न प्लेटफार्मों के लिए compilers का एक बहुत है, अब इसे समर्थन pthreads
Crypto++ है के साथ के रूप में क्रॉस-प्लेटफार्म, जिसका मतलब विंडोज, लिनक्स, ओएस एक्स और बीएसडी पर चलता है। यह उन स्थानों पर थ्रेडिंग समर्थन के लिए ओपनएमपी का उपयोग करता है जहां ऑपरेशन महंगा हो सकता है, जैसे मॉड्यूलर एक्सपोनेंटिएशन और मॉड्यूलर गुणा (और जहां समवर्ती ऑपरेशन किया जा सकता है)।
विंडोज़ pthreads का समर्थन नहीं करता है, लेकिन आधुनिक विंडोज कंपाइलर्स OpenMP का समर्थन करते हैं। तो यदि आप गैर-* निक्स के लिए पोर्टेबिलिटी चाहते हैं, तो ओपनएमपी अक्सर एक अच्छा विकल्प होता है।
और माइक के रूप में यह भी कहा:
OpenMP महान अगर सभी आप क्या करना चाहते कुछ #pragma बयान जोड़ सकते हैं और बहुत जल्दी अपने कोड का एक समानांतर संस्करण है है।
नीचे क्रिप्टो की ++ के रूप में RSA signatures and Rabin-Williams signatures... में बर्नस्टीन द्वारा वर्णित भी बदलाव जड़ें का उपयोग कर राबिन विलियम्स हस्ताक्षर में इस्तेमाल मूल्यों precomputing एक उदाहरण है:
void InvertibleRWFunction::Precompute(unsigned int /*unused*/)
{
ModularArithmetic modp(m_p), modq(m_q);
#pragma omp parallel sections
{
#pragma omp section
m_pre_2_9p = modp.Exponentiate(2, (9 * m_p - 11)/8);
#pragma omp section
m_pre_2_3q = modq.Exponentiate(2, (3 * m_q - 5)/8);
#pragma omp section
m_pre_q_p = modp.Exponentiate(m_q, m_p - 2);
}
}
यह माइक अवलोकन के साथ फिट बैठता है - ठीक अनाज नियंत्रण और तुल्यकालन था वास्तव में जरूरत नहीं है। समांतरता का उपयोग निष्पादन को तेज करने के लिए किया गया था, और स्रोत कोड में सिंक्रनाइज़ेशन की कोई कीमत नहीं थी।
और अगर OpenMP उपलब्ध नहीं है, कोड को कम कर देता है:
m_pre_2_9p = modp.Exponentiate(2, (9 * m_p - 11)/8);
m_pre_2_3q = modq.Exponentiate(2, (3 * m_q - 5)/8);
m_pre_q_p = modp.Exponentiate(m_q, m_p - 2);
कृपया पर विस्तृत समाधान scalability। क्या स्केलेबिलिटी केवल संकलन समय पर लागू होती है या यह रनटाइम पर निर्धारित होती है? या रनटाइम स्केलेबिलिटी केवल धागे के साथ किया जा सकता है? – awiebe
आप या तो संकलन या रनटाइम पर बनाए गए धागे की संख्या सेट कर सकते हैं। यदि आप रनटाइम पर नंबर सेट करना चुनते हैं, तो आप थ्रेड की संख्या को पर्यावरण परिवर्तनीय numthreads के माध्यम से सेट कर सकते हैं, जैसे कि इसे आसानी से किसी भी आर्किटेक्चर पर चलने वाले उचित नंबर पर सेट किया जा सकता है। –
यह उत्तर कोई मतलब नहीं है। ओपनएमपी पॉज़िक्स धागे की तरह एक थ्रेडिंग मॉडल है। ओपनएमपी के पहले कुछ संस्करणों के लिए भी काम नहीं था। – Jeff