2009-09-13 13 views
12

पिछले कुछ वर्षों में, मैं और समय मैं (जैसे SSE प्रोग्रामिंग के लिए लोगों के रूप में) संकलक आंतरिक कार्यों पर भरोसा किया गया है का सबसे या प्रोग्रामिंग विधानसभा पर SIMD प्रोग्रामिंग का एक बहुत कर रहा हूँ वास्तव में निफ्टी सामान पाने के लिए। हालांकि, अब तक मैं शायद ही कभी सिमड के लिए अंतर्निहित समर्थन के साथ किसी प्रोग्रामिंग भाषा को खोजने में सक्षम हूं।SIMD प्रोग्रामिंग भाषाओं

अब स्पष्ट रूप से एचएलएसएल, सीजी और जीएलएसएल जैसी शेडर भाषाएं हैं जिनके पास इस तरह की चीजों के लिए मूल समर्थन है, हालांकि, मैं ऐसा कुछ ढूंढ रहा हूं जो कम से कम एसएसई को ऑटोवॉक्टरिज़ेशन के बिना संकलित करने में सक्षम है लेकिन अंतर्निर्मित वेक्टर परिचालन के लिए समर्थन। क्या ऐसी भाषा मौजूद है?

यह (का हिस्सा) एक छग शेडर है कि एक चर्चा करता है का एक उदाहरण है और वाक्य रचना के संदर्भ में यह शायद मैं के लिए क्या देख रहा हूँ के सबसे करीब है।

float4 pixelfunction(
    output_vs IN, 
    uniform sampler2D texture : TEX0, 
    uniform sampler2D normals : TEX1, 
    uniform float3 light, 
    uniform float3 eye) : COLOR 
{ 
    float4 color = tex2D(texture, IN.uv); 
    float4 normal = tex2D(normals, IN.uv) * 2 - 1; 

    float3 T = normalize(IN.T); 
    float3 B = normalize(IN.B); 

    float3 N = 
     normal.b * normalize(IN.normal) + 
     normal.r * T + 
     normal.g * B; 

    float3 V = normalize(eye - IN.pos.xyz); 
    float3 L = normalize(light - IN.pos); 
    float3 H = normalize(L + V); 

    float4 diffuse = color * saturate(dot(N, L)); 
    float4 specular = color * pow(saturate(dot(N, H)), 15); 
    float falloff = dot(L, normalize(light)); 

    return pow(falloff, 5) * (diffuse + specular); 
} 

सामग्री इस भाषा में कोई वास्तविक चाहिए होगा कि है:

  • धूर्तता ऑपरेटरों में निर्मित
  • वेक्टर आपरेशन (डॉट, पार, सामान्य, परिपूर्ण, प्रतिबिंबित वगैरह)
  • कस्टम डेटा प्रकारों (structs) के लिए समर्थन
  • डायनामिक ब्रांचिंग अच्छा होगा (लूप के लिए, यदि बयान)

उत्तर

6

तो हाल ही में इंटेल ने ISPC जारी किया जो वास्तव में मैं इस प्रश्न पूछने के लिए देख रहा था। यह एक ऐसी भाषा है जो सामान्य सी कोड से जुड़ी हो सकती है, जिसमें निष्पादन मॉडल है और प्रारंभिक पोस्ट (स्विजल ऑपरेटर, ब्रांचिंग, डेटा स्ट्रक्चर, वेक्टर ओप, शेडर जैसे) में उल्लिखित सभी सुविधाओं के लिए समर्थन और एसएसई 2, एसएसई 4 के लिए संकलन, एवीएक्स, एवीएक्स 2, और ज़ीओन फाई वेक्टर निर्देश।

0

वह फोरट्रान होगा जिसे आप ढूंढ रहे हैं। यदि मेमोरी ओपन-सोर्स कंपाइलर्स (जी 5 9, गफ्रेट्रान) भी सेवा प्रदान करती है तो एसएसई का लाभ उठाएगी यदि यह आपके हार्डवेयर पर लागू हो।

+2

उन फोरट्रान कार्यान्वयन अभी भी उसी तरह सबसे सी ++ compilers इस समर्थन में स्वत: vectorization का उपयोग करें। मेरे साथ समस्या यह है कि यह अनुमान लगाने में बहुत मुश्किल है कि कौन सा कोड वेक्टरकृत किया जाएगा और कौन सा कोड नहीं होगा। अब मुझे फोरट्रान कंपाइलर्स में इसकी स्थिति पता नहीं है क्योंकि मेरी पृष्ठभूमि सी ++ में है, इसलिए मुझे लगता है कि मैं एक उच्च स्तरीय शेडर जैसी दृष्टिकोण पसंद करूंगा जो मुझे अंतिम आउटपुट पर अधिक नियंत्रण प्रदान करे। –

6

यह वास्तव में नहीं ही भाषा है, लेकिन वहाँ मोनो के लिए एक पुस्तकालय (Mono.Simd) है कि आप के लिए वैक्टर बेनकाब और SSE में उन पर आपरेशन का अनुकूलन जब भी संभव हो जाएगा:

+0

यह समाधान अच्छा लग रहा है; सी ++ इंट्रिनिक्स से कहीं बेहतर दिखता है। हालांकि समाधान लगभग बराबर है और जो मैं खोज रहा हूं वह नहीं है। (मैं बोल्ट किए गए सिमड बिल्ट-इन के साथ डिज़ाइन की गई वास्तविक भाषाओं की तलाश में था)। हालांकि, नेट आधारित समाधान करते समय यह निश्चित रूप से याद रखना कुछ है। –

0

वर्तमान में सबसे अच्छा समाधान करना है ओपन-सोर्स सीजी फ्रंटेंड के लिए बैक-एंड बनाकर खुद को एनवीडिया जारी किया गया, लेकिन मैं खुद को प्रयास को सहेजना चाहता हूं इसलिए अगर यह पहले किया गया है तो मैं उत्सुक हूं। अधिमानतः मैं इसे तुरंत उपयोग करना शुरू कर दूंगा।

+0

सीजी खुला स्रोत नहीं है, यह एनवीडिया के लिए स्वामित्व है। सीपीयू के लिए उत्पन्न सिम कोड को बैक-एंड बनाने के लिए यह एक बड़ी मात्रा में काम होगा। लुई उत्तर के रूप में, आपको गंभीरता से ओपनसीएल की जांच करनी चाहिए। आप सी-आधारित भाषा (सीजी और जीएलएसएल के समान) में प्रसंस्करण कर्नेल लिख सकते हैं और इसे या तो GPU या CPU पर चला सकते हैं (जहां यह आपके लिए सिम कोड उत्पन्न करेगा)। ओपनसीएल क्रॉस-प्लेटफार्म है, जो कई विक्रेताओं (एनवीडिया, एटीआई, ऐप्पल इत्यादि) द्वारा समर्थित है और आप तुरंत एक एसडीके प्राप्त कर सकते हैं। – gavinb

+0

सीजी फ्रंट एंड स्रोत कोड http://developer.nvidia.com/object/cg_compiler_code.html पर उपलब्ध है कोड को विशेष रूप से कंपाइलर के लिए बैक-एंड बनाने के लिए उपलब्ध कराया गया है। हालांकि, मैं ओपनसीएल जैसे मौजूदा समाधान पसंद करता हूं। –

7

आपकी सर्वश्रेष्ठ शर्त शायद ओपनसीएल है। मुझे पता है कि इसे ज्यादातर जीपीयू पर कोड चलाने के तरीके के रूप में प्रचारित किया गया है, लेकिन ओपनसीएल कर्नेल को संकलित और सीपीयू पर भी चलाया जा सकता है। OpenCL मूल रूप से कुछ प्रतिबंधों के साथ C:

  1. कोई समारोह संकेत
  2. नहीं प्रत्यावर्तन

और परिवर्धन के एक झुंड। विशेष वेक्टर प्रकार में:

float4 x = float4(1.0f, 2.0f, 3.0f, 4.0f); 
float4 y = float4(10.0f, 10.0f, 10.0f, 10.0f); 

float4 z = y + x.s3210 // add the vector y with a swizzle of x that reverses the element order 

बड़ा चेतावनी पर है कि कोड सफाई से sperable हो गया है, OpenCL मनमाना पुस्तकालयों, आदि के लिए बाहर कॉल नहीं कर सकते लेकिन अपने गणना कर्नेल यथोचित रूप से स्वतंत्र हैं तो आप मूल रूप से एक मिल वेक्टर बढ़ाया सी जहां आपको intrinsics का उपयोग करने की आवश्यकता नहीं है।

Here एक त्वरित संदर्भ/एक्सटेंशन के सभी के साथ cheatsheet है।

+0

क्या मैं अभी भी एक सी अनुप्रयोग में ओपनसीएल libs को लिंक कर सकता हूं और इसे वैक्टरों का एक सेट सौंप सकता हूं? –

+0

इसके बारे में सोचने के लिए, इसे जोड़ने में सक्षम होने की आवश्यकता नहीं है, मुझे बस कुछ डेटा पास करने में सक्षम होना चाहिए :-) –

+1

असल में, आप एक ओपनसीएल गणना कर्नेल संकलित करते हैं जिसमें एक सी फंक्शन एक प्रविष्टि बिंदु के रूप में होता है , तो आप ओपनसीएल को आपके द्वारा निर्दिष्ट पैरामीटर का उपयोग करके कर्नेल को चलाने के लिए बताते हैं, जो वैक्टर, डेटा सेट या यहां तक ​​कि बनावट भी हो सकता है। –

1

यह सी ++ के लिए एक पुस्तकालय भाषा में बनाया बजाय है, है, लेकिन Eigen सुंदर अदृश्य है एक बार अपने चर घोषित कर रहे हैं।

0

डी प्रोग्रामिंग भाषा भी मोनो.SIMD की तुलना में सिम तक पहुंच प्रदान करती है।

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