मैं दो घोंसले वाले लूपों को गति देने के लिए समांतर प्रसंस्करण का उपयोग करने की कोशिश कर रहा हूं, लेकिन मुझे सिंटैक्स सही होने में परेशानी हो रही है। मैं बिटमैप में कितने पिक्सेल लाल या सफेद या काले रंग के मूल्यों की गिनती करने की कोशिश कर रहा हूं, जिनके लिए मेरे पास कहीं और है।साझा चर के साथ समानांतर के लिए समानांतर
धारावाहिक प्रसंस्करण में मैं निम्नलिखित कोड है, जो ठीक काम करता है है:
: Bitmap image = new Bitmap(@"Input.png");
var colourCount = new int[3];
for (var x = 0; x < image.Width; x++)
{
for (var y = 0; y < image.Height; y++)
{
switch (image.GetPixel(x, y).ToArgb())
{
case (int)colours.red: colourCount[0]++; break;
case (int)colours.white: colourCount[1]++; break;
case (int)colours.black: colourCount[2]++; break;
default: throw new ArgumentOutOfRangeException(string.Format("Unexpected colour found: '{0}'", image.GetPixel(x, y).ToArgb()));
}
}
}
मैं माइक्रोसॉफ्ट द्वारा और Stackoverflow से छोरों कि इस तरह के नीचे के रूप में एक साझा चर का अद्यतन के लिए समानांतर के लिए कोड को देखा है
Parallel.For<int>(0, result.Count,() => 0, (i, loop, subtotal) =>
{
subtotal += result[i];
return subtotal;
},
(x) => Interlocked.Add(ref sum, x)
);
लेकिन सभी उदाहरण एक सरल प्रकार का उपयोग करते हैं जैसे एक साझा चर के रूप में int और मैं बस अपने आकार तीन सरणी को लिखने के लिए वाक्यविन्यास नहीं समझ सकता। क्या मैं यह सब गलत कर रहा हूँ?
वैसे, मुझे प्रदर्शन के संदर्भ में पता है कि GetPixel बिटमैप जैसे कुछ धीमे है। लॉकबिट्स, मैं बस समांतर लूप के सिद्धांत को प्राप्त करने की कोशिश कर रहा हूं।
आपको वास्तव में अपने 'स्थानीय' में 'लॉक' की आवश्यकता नहीं है। आप इसके बजाय अपने लूप में 'Interlocked.Add() 'का उपयोग कर सकते हैं। हालांकि 'लॉक' का उपयोग करना इसे और अधिक स्पष्ट रूप से सही बनाता है। – svick
@svick: 'Interlocked.Add' के एकाधिक आमंत्रण एकल 'लॉक' से कम कुशल हो सकते हैं। (निश्चित रूप से मामला होगा यदि 'colourCount' में तत्वों के दस शामिल होते हैं; 3. के लिए सुनिश्चित नहीं है) प्रति [अल्बाहारी] (http://www.albahari.com/threading/part4.aspx): "सभी' इंटरलाक्ड '' तरीके एक पूर्ण बाड़ उत्पन्न करते हैं। " दोहराया कैश अमान्यता ओवरहेड एकल लॉक की लागत से अधिक हो सकता है। – Douglas
इसे पोस्ट करने के लिए धन्यवाद, यह अब मेरे लिए बहुत अधिक समझ में आता है। आप यह सुझाव देने में सही हैं कि GetPixel थ्रेड-सुरक्षित नहीं है, वास्तव में किसी भी छवि गुणों या विधियों तक पहुंचने के लिए कोई संख्या नहीं है, इसलिए मुझे इसके चारों ओर एक रास्ता पता लगाना होगा, लेकिन मेरे पास लूप खुद ठीक काम कर रहा है। एक बार फिर धन्यवाद! –