2010-10-26 10 views
7

मैं विजुअल स्टूडियो 2008 में और मैं के लिए विकल्प दिखाई परियोजना सेटिंग्स में काम कर रहा हूँ जो मैं कोई नहीं, SSE या SSE2सी ++ कोड लिखने के लिए कैसे संकलक सिम के लिए आसानी से अनुकूलित कर सकते हैं?

करने के लिए सेट कर सकते हैं "विस्तारित अनुदेश समुच्चय को सक्रिय" तो संकलक में एक साथ बैच निर्देश करने की कोशिश करेंगे सिम निर्देशों का उपयोग करने के लिए आदेश?

वहाँ रहे हैं किसी भी नियम कैसे कोड इस तरह के अनुकूलन करने के लिए है कि संकलक effiecient कोडांतरक इन एक्सटेंशन का उपयोग कर सकते हैं में से एक का पालन कर सकते हैं?

उदाहरण के लिए वर्तमान में मैं एक raytracer पर काम कर रहा हूँ। एक शेडर कुछ इनपुट लेता है और एक आउटपुट रंग, इस तरह इनपुट से गणना करता है:

PixelData data = RayTracer::gatherPixelData(pixel.x, pixel.y); 
Color col = shadePixel(data); 

यह उदाहरण के लिए shadercode ऐसी है कि वह एक अनुदेश कॉल के भीतर छाया 4 अलग पिक्सल होगा लिखने के लिए फायदेमंद हो सकता है? इस तरह कुछ:

PixelData data1 = RayTracer::gatherPixelData(pixel1.x, pixel1.y); 
... 
shadePixels(data1, data2, data3, data4, &col1out, &col2out, &col3out, &col4out); 

एक साथ कई डेटा्यूनिट को संसाधित करने के लिए। क्या यह कंपाइलर एसएसई निर्देशों का उपयोग करने के लिए फायदेमंद होगा?

धन्यवाद!

उत्तर

5

मैं विजुअल स्टूडियो 2008 में और मैं जो मैं कोई नहीं करने के लिए सेट कर सकते हैं "विस्तारित अनुदेश समुच्चय को सक्रिय" के लिए विकल्प दिखाई परियोजना सेटिंग्स में काम कर रहा हूँ, SSE या SSE2

तो संकलक एक साथ क्रम में SIMD निर्देश का उपयोग करने के बैच निर्देश करने की कोशिश करेंगे?

नहीं, संकलक स्वयं पर वेक्टर निर्देशों का उपयोग नहीं करेगा। यह x87 वाले के बजाय स्केलर एसएसई निर्देशों का उपयोग करेगा।

जो आप वर्णन करते हैं उसे "स्वचालित वेक्टरेशन" कहा जाता है। माइक्रोसॉफ्ट कंपाइलर्स ऐसा नहीं करते हैं, Intel compilers करें।

माइक्रोसॉफ्ट संकलक पर आप intrinsics का उपयोग मैनुअल SSE ऑप्टिमाइज़ेशन करने के लिए कर सकते हैं।

+0

ताकि वेक्टर निर्देशों का उपयोग करने के लिए असेंबली लिखना आवश्यक हो? – Mat

+0

मुझे लगता है कि सुमा का मतलब इनमें से एक है: http://software.intel.com/en-us/articles/intel-compilers/ – mkb

+0

@Mat - आप सिमड कोड लिखने के लिए कंपाइलर इंट्रिनिक्स का उपयोग कर सकते हैं। Http://msdn.microsoft.com/en-us/library/y0dh78ez%28VS.71%29.aspx – celion

0

संकलक सभी शक्तिशाली नहीं है, और यह कुछ सीमाएँ हैं। यदि यह कर सकता है (और यदि सही झंडे इसे पास कर दिए जाते हैं), तो यह एसएसई निर्देशों का उपयोग करेगा। यह देखने का एकमात्र तरीका यह है कि संकलक द्वारा उत्पन्न असेंबली कोड की जांच करना क्या है।

एक अन्य विकल्प सी SSE/SSE2 निर्देश का प्रयोग है। खिड़कियों के लिए आप उन्हें यहाँ पा सकते हैं:

http://msdn.microsoft.com/en-us/library/y0dh78ez%28VS.80%29.aspx

3

तीन अवलोकन।

  1. सबसे अच्छा speedups अनुकूलन से लेकिन अच्छा एल्गोरिदम से नहीं आ रहे हैं। तो सुनिश्चित करें कि आप उस हिस्से को पहले प्राप्त करें। अक्सर इसका मतलब है कि अपने विशिष्ट डोमेन के लिए सही पुस्तकालयों का उपयोग करना।

  2. बार जब आप अपने एल्गोरिदम मिल सही यह उपाय का समय है। अक्सर काम पर एक 80/20 नियम है। आपके कोड का 20% निष्पादन समय का 80% लेगा। लेकिन उस हिस्से को ढूंढने के लिए आपको एक अच्छा प्रोफाइलर चाहिए।Intel VTune आपको प्रदर्शन समारोहों को इंगित करने वाले प्रत्येक फ़ंक्शन और अच्छी रिपोर्ट से नमूना प्रोफ़ाइल दे सकता है। यदि आपके पास एएमडी सीपीयू है तो एक और मुफ्त विकल्प AMD CodeAnalyst है।

  3. कंपाइलर ऑटोवॉक्टरिज़ेशन क्षमता चांदी की बुलेट नहीं है। यद्यपि यह वास्तव में कठिन प्रयास करेगा (विशेष रूप से Intel C++) आपको अक्सर वेक्टर फॉर्म में एल्गोरिदम को फिर से लिखकर इसकी सहायता करने की आवश्यकता होगी। आप सिमड निर्देशों का उपयोग करने के लिए बाधा कोड के छोटे हिस्सों को हैंडक्रैफ्ट करके अक्सर बेहतर परिणाम प्राप्त कर सकते हैं। आप आंतरिक रूप से इनलाइन असेंबली का उपयोग कर सी कोड में (ऊपर वीजेओ लिंक देखें) कर सकते हैं।

पाठ्यक्रम भागों 2 और 3 फार्म एक सतत प्रक्रिया के

। यदि आप इसके बारे में वास्तव में गंभीर हैं तो इस विषय पर कुछ अच्छी किताबें हैं जैसे इंटेल लोग The Software Optimization Cookbook और प्रोसेसर संदर्भ मैनुअल।

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