2016-02-11 27 views
5

मैं System.Numerics.Vector<T> (documentation) का उपयोग करने की कोशिश कर रहा हूं।वेक्टर <T> क्यों है स्थिर?

मैं एक साधारण इकाई परीक्षण लिखा है:

var v = new System.Numerics.Vector<double>(new double[] { 12, 13, 14 }); 
Assert.AreEqual(3, v.Count); 

लेकिन यह मेरे लिए एक निर्माण त्रुटि दिया:

Member 'Vector.Count' cannot be accessed with an instance reference; qualify it with a type name instead

मेरे आश्चर्य करने के लिए, Vector<T>.Count स्थिर है।

तो मैं करने की कोशिश की:

var v = new System.Numerics.Vector<double>(new double[] { 12, 13, 14 }); 
Assert.AreEqual(3, Vector<double>.Count); 

अब कोड बनाता है लेकिन इकाई परीक्षण में विफल रहता है:

Assert.AreEqual failed. Expected:<3>. Actual:<2>.

पर क्या हो रहा है?


जांच मैंने पाया:

Assert.AreEqual(2, Vector<double>.Count); 
Assert.AreEqual(4, Vector<float>.Count); 
Assert.AreEqual(4, Vector<int>.Count); 
Assert.AreEqual(2, Vector<long>.Count); 
+2

आपका दो स्निपेट समान हैं। – BoltClock

+0

@ बोल्टक्लॉक धन्यवाद तय। –

+0

ठीक है, आप खोज रहे हैं कि वर्ग को ढांचे में क्यों नहीं जोड़ा गया था। हैसवेल या ब्रॉडवेल प्रोसेसर पर आपको जो मूल्य मिलता है वह भी गलत है, यह मूल्य को दोगुना होना चाहिए क्योंकि यह AVX2 द्वारा प्रदान किए गए 256 बिट वाईएमएम रजिस्टरों का उपयोग करेगा। मेज पर 2x perf छोड़ देता है, उस कार्यान्वयन विस्तार को छिपाने के लिए मुश्किल है। AVX-512 जल्द ही आ रहा है :) –

उत्तर

4

The documentation पता चलता है कि इस डिजाइन के द्वारा होता है:

The count of a Vector instance is fixed, but its upper limit is CPU-register dependent.

इसका उद्देश्य हार्डवेयर क्षमताओं का उपयोग कर संचालन vectorizing अनुमति देने के लिए है, और इस तरह अपनी क्षमता से जुड़ा हुआ है आपके सीपीयू के आर्किटेक्चर में।

+3

एमएसडीएन से यह बयान सिर्फ चीजों को और अधिक भ्रमित करने वाला आईएमओ बनाता है, क्योंकि वाक्यांश "वेक्टर उदाहरण की गिनती" का अर्थ है कि गणना वास्तव में एक उदाहरण सदस्य है। – BoltClock

+1

धन्यवाद जो पेज से स्पष्ट नहीं था, मैं पढ़ रहा था "वेक्टर में संग्रहीत तत्वों की संख्या देता है।" https://msdn.microsoft.com/en-us/library/dn877911(v=vs.111).aspx –

+0

@ बोल्टक्लॉक ट्रू, यह उतना स्पष्ट नहीं है जितना होना चाहिए। – BartoszKP

2

वेक्टर कुछ भ्रमित प्रकार हो सकता है। यह पूर्वनिर्धारित-लंबाई संग्रह तय है। यह तय है क्योंकि इसकी लंबाई हमेशा == Vector<T>.Count है। तो अगर आप कार्य करें:

var v = new Vector<double>(new double[] { 12, 13, 14 }); 
Console.WriteLine(v); 

परिणाम है ...:

<12, 13> 

यह सिर्फ Vector<double>.Count जो होता है पर सभी मूल्यों चला जाता है होना करने के लिए 2. चाल कि Vector<T>.Count CPU वास्तुकला के आधार पर भिन्न हो सकता है ।

यह वास्तव में बहुत कम स्तर आदिम है, वर्णन कहते हैं:

Represents a single vector of a specified numeric type that is suitable for low-level optimization of parallel algorithms.

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