2017-02-10 10 views
13

मैं कुछ कोड है जो लग रहा है इस तरह एक सा है:थ्रेड सुरक्षा :: random_device

  • std::random_device धागा सुरक्षित है:

    std::random_device rd; 
    
    #pragma omp parallel 
    { 
        std::mt19937 gen(rd()); 
        #pragma omp for 
        for(int i=0; i < N; i++) 
        { 
         /* Do stuff with random numbers from gen() */ 
        } 
    } 
    

    मैं कुछ प्रश्न हैं? यानी क्या यह कुछ अवांछित करने जा रहा है जब कई धागे इसे एक बार में बुलाते हैं?

  • क्या यह आम तौर पर एक अच्छा विचार है? क्या मुझे यादृच्छिक संख्या धाराओं को ओवरलैप करने के बारे में चिंतित होना चाहिए?
  • क्या मैं चाहता हूं कि प्राप्त करने के लिए एक बेहतर तरीका है (प्रत्येक धागे में स्वतंत्र यादृच्छिक संख्या धाराएं - मैं फिलहाल पुनरुत्पादन के बारे में चिंतित नहीं हूं)?

मामले में यह std::random_device के कामकाज मैं मुख्य रूप से विंडोज पर चल रहा हूँ करने के लिए कोई फर्क है, हालांकि मैं भी लिनक्स और OSX पर समान रूप से काम करने के लिए कोड चाहते हैं।

+0

आप पुनरुत्पादन प्राप्त कर सकते हैं लेकिन 'std :: random_device' का उपयोग करने के बजाय एक विशिष्ट बीज का उपयोग कर सकते हैं। – Galik

+0

'random_device' अवरुद्ध होने की संभावना है। यदि आप जो चाहते हैं वह समांतरता है, तो इसका उपयोग करने में कोई और बात नहीं है। आप 'mt19937' बीज के लिए' random_device' के साथ बीजित वैश्विक पीआरएनजी का उपयोग कर सकते हैं (लेकिन इसे स्पष्ट लॉकिंग की आवश्यकता होगी)। – sbabbi

उत्तर

3

नोट: इस जवाब पर GCC Linux लेकिन OpenMP सामान्य रूप में std सूत्रण मॉडल के साथ अंतर-संचालित करने के लिए गारंटी नहीं है काम करता है, thread_local की तरह इतना सुविधाएँ काम न करें।

मैं शायद PRNG धागा स्थानीय स्थिर बनाना होगा और इसके साथ प्रारंभ (अगर यह मुझे होगा इस उत्तर को हटाना होगा) एक अस्थायी std::random_device:

#pragma omp parallel 
{ 
    // different gen for each thread 
    thread_local static std::mt19937 gen(std::random_device{}()); 
    #pragma omp for 
    for(int i=0; i < N; i++) 
    { 
     /* Do stuff with random numbers from gen() */ 
    } 
} 

आप ठीक एक std::mt19937 दे देंगे कि प्रति थ्रेड और फ़ंक्शन के एकाधिक आमंत्रणों के माध्यम से उन्हें बनाने पर समय बचाएं।

+1

धन्यवाद, मुझे 'thread_local' कीवर्ड से अवगत नहीं था। अधिक आम तौर पर, ओपनएमपी समांतर क्षेत्रों के साथ इस शैली की शैली करते समय, क्या मुझे चीजों को ठीक से थ्रेड करने के लिए 'थ्रेड_लोकल' का उपयोग करना चाहिए? मैंने सोचा कि समानांतर क्षेत्र के अंदर चर को घोषित करना पर्याप्त था? – Theolodus

+0

@Theolodus वास्तव में हाँ आप सही हैं, समानांतर क्षेत्र में होने से यह पहले से ही थ्रेड विशिष्ट बनाता है। मुझे लगता है कि इससे दूर लेना यह है कि थ्रेड विशिष्ट माध्यम होने के कारण इसे 'स्थैतिक' बनाया जा सकता है यदि फ़ंक्शन को अक्सर बुलाया जाता है और जनरेटर को अस्थायी रूप से अस्थायी रूप से एक बार से अधिक अस्थायी बनाने के भुगतान के बिना प्रारंभ किया जा सकता है (प्रति धागा) – Galik

+0

क्या आप निश्चित हैं कि '#pragma omp' सी ++ 11 थ्रेडिंग मॉडल पूरी तरह से पालन करता है? थ्रेड स्थानीय लोगों को 'std' थ्रेडिंग के भीतर काम करने की गारंटी है, लेकिन उनके लिए अन्य थ्रेडिंग सिस्टम में काम करने के लिए आपको उस थ्रेडिंग सिस्टम के लेखकों से गारंटी की आवश्यकता है ... – Yakk

संबंधित मुद्दे