की एक धारा के लिए उच्च प्रदर्शन बफरिंग कि एक बड़ी संख्या (लाखों वर्तमान में, अंत में अरबों) अपेक्षाकृत कम की (5-100 तत्वों) यादृच्छिक संख्याओं के एरे की खपत और के साथ कुछ नहीं-बहुत-ज़ोरदार गणित करता है उन्हें। यादृच्छिक संख्याएं, अच्छी तरह से, यादृच्छिक, आदर्श रूप से मैं उन्हें एकाधिक कोर पर उत्पन्न करना चाहता हूं, क्योंकि यादृच्छिक संख्या पीढ़ी> प्रोफाइलिंग में मेरे रनटाइम का 50% है। हालांकि, मुझे बड़ी संख्या में छोटे कार्यों को वितरित करने में कठिनाई हो रही है जो एकल-थ्रेडेड दृष्टिकोण से धीमी नहीं है।मैं कोड है रैंड
for(int i=0;i<1000000;i++){
for(RealVector d:data){
while(!converged){
double[] shortVec = new double[5];
for(int i=0;i<5;i++) shortVec[i]=rng.nextGaussian();
double[] longerVec = new double[50];
for(int i=0;i<50;i++) longerVec[i]=rng.nextGaussian();
/*Do some relatively fast math*/
}
}
}
दृष्टिकोण मैं लिया है कि है नहीं काम कर रहे हैं::
मेरे कोड वर्तमान में कुछ इस तरह दिखता
- 1+ एक ArrayBlockingQueue, पॉप्युलेट धागे और अपने मुख्य पाश लेने वाली और सरणी को पॉप्युलेट करना (मुक्केबाजी/अनबॉक्सिंग यहां हत्यारा था)
- गणित के गैर-निर्भर हिस्सों को करते हुए एक कॉल करने योग्य (भविष्य का उत्पादन) वाले वैक्टर उत्पन्न करना (ऐसा लगता है कि जो भी समानांतरता लाभ प्राप्त हुआ है, उससे संकेत मिलता है)
- 2 ArrayBlockingQueue का उपयोग करके, प्रत्येक थ्रेड द्वारा पॉप्युलेट किया गया है, एक छोटा और एक लंबे सरणी के लिए एक (अभी भी लगभग दो बार प्रत्यक्ष सिंगल-थ्रेडेड के रूप में धीमा मामला)।
मैं अपने विशेष समस्या कैसे समानांतर में छोटे और स्वतंत्र पुरातन की बड़ी धाराओं पैदा करने और उन्हें एक ही धागे से लेने के सामान्य मामले को संभालने के लिए के रूप में इतना करने के लिए "समाधान" के लिए नहीं देख रहा हूँ।
@ ग्रे भी सच है। प्रश्न का उत्तर देने के करीब आना। –
पृष्ठभूमि में बैचों में यादृच्छिक संख्या उत्पन्न करने के लिए एक्सचेंजर का उपयोग करने का एक उदाहरण जोड़ा गया। –
संचार के लिए एक एक्सचेंजर का संयोजन और रैंडों की लंबी धाराओं को चंकने से प्रदर्शन के लिए बहुत कुछ किया गया। धन्यवाद। – Bryce