2012-09-29 7 views
11

मैं जीपीयू प्रोग्रामिंग के लिए काफी नया हूं, लेकिन चूंकि मेरे पास कम्प्यूटेशनल गहन कार्य है, इसलिए मैं संभावित प्रदर्शन लाभ के लिए जीपीयू में बदल गया हूं।कच्चे CUDA प्रोग्रामिंग बनाम ArrayFire?

मैंने ArrayFire Free संस्करण के साथ अपने प्रोग्राम को फिर से लिखने का प्रयास किया। यह बहु-थ्रेडिंग सक्षम के साथ मेरे सीपीयू रूटीन की तुलना में वास्तव में तेज़ है, लेकिन मुझे अपेक्षित डिग्री (यानी, < 100% स्पीडअप) नहीं है, और लौटाए गए परिणाम सही नहीं हैं (< सीपीयू रूटीन की तुलना में 1% त्रुटि, मानते हुए सीपीयू रूटीन के परिणाम सही हैं)।

मेरा काम मुख्य रूप से तत्व-वार फ्लोट -32 गणित के बड़े मैट्रिस (300 एमबी -500 एमबी आकार) पर छोटे-छोटे if-thens/स्विच-केस आदि के साथ संचालन है। मुझे लगता है कि प्रदर्शन की बाधा सीपीयू और जीपीयू के बीच बैंडविड्थ की संभावना है स्मृति क्योंकि बहुत सारे डेटा-रीडिंग इत्यादि हैं। जीपीयू का परीक्षण मैंने 3 जीबी वीडियो मेमोरी के साथ एक GeForce 580GTX है।

क्या मैं अभी भी अपने कार्य के लिए ArrayFire का उपयोग करने के बजाय कच्चे CUDA कोड (CUBLAS आदि और औसत अनुकूलन के साथ) लिखने के लिए अनुकूलन के लिए कुछ महत्वपूर्ण कमरा है? मैंने कुछ एनवीआईडीआईए अनुकूलन मार्गदर्शिकाएं पढ़ीं; ऐसा लगता है कि तेजी से डेटा-पहुंच और बैंक-विवादों को कम करने के लिए वहां कुछ स्मृति-पहुंच चालें हैं। क्या ArrayFire स्वचालित रूप से इन सामान्य चाल का उपयोग करता है या नहीं?

उत्तर

16

पोस्ट के लिए धन्यवाद। प्रारंभिक परिणाम सुनने के लिए खुशी कुछ गति दे रहे थे। मैं ArrayFire पर काम करता हूं और यहां आपके प्रश्नों पर झुक सकता हूं।

पहला और सबसे महत्वपूर्ण, किसी के लिए विशिष्टता के साथ मदद करने के लिए कोड वास्तव में आवश्यक है। क्या आप अपना कोड लिख सकते हैं?

दूसरा, आपको निम्न में सीयूडीए और एरेफ़ीयर के बारे में सोचना चाहिए: सीयूडीए जीपीयू प्रोग्राम करने का एक तरीका है जो आपको इच्छित जीपीयू कोड लिखने की क्षमता प्रदान करता है। लेकिन बेवकूफ CUDA कोड (अक्सर सीपीयू से धीमी) और विशेषज्ञ, समय-स्टैकिंग, हाथ से अनुकूलित CUDA कोड के बीच एक बड़ा अंतर है। ArrayFire (और CUBLAS जैसे कुछ अन्य जीपीयू पुस्तकालयों) में कई मैन-साल ऑप्टिमाइज़ेशन डाले गए हैं, और आम तौर पर अधिकतर सामान्य लोगों के पास बेहतर परिणाम देने के लिए बेहतर परिणाम मिलेंगे। हालांकि, इसमें कोई भिन्नता भी है कि कोई व्यक्ति ArrayFire (या अन्य पुस्तकालयों) का कितना अच्छा उपयोग करता है। ऐसे चर हैं जो सर्वोत्तम प्रदर्शन प्राप्त करने के लिए ArrayFire लाइब्रेरी कॉल के उपयोग में tweaked किया जा सकता है। यदि आप अपना कोड पोस्ट करते हैं, तो हम यहां कुछ लोगों को साझा करने में मदद कर सकते हैं।

तीसरा, ऐरेफायर ब्लैस पर भरोसा करने वाले कार्यों में CUBLAS का उपयोग करता है, इसलिए आपको सीधे CUBLAS का उपयोग करके बहुत अंतर दिखाई नहीं दे रहा है।

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

अंत में, आपके द्वारा देखी गई डेटा विसंगतियों की संभावना सीपीयू बनाम GPU कंप्यूटिंग की प्रकृति के कारण होती है। चूंकि वे अलग-अलग डिवाइस हैं, इसलिए आप अक्सर थोड़ा अलग परिणाम देखेंगे। ऐसा नहीं है कि सीपीयू GPU की तुलना में बेहतर परिणाम देता है, बल्कि यह कि वे दोनों अलग-अलग तरीकों से सटीक परिशुद्धता के साथ काम कर रहे हैं। यदि आप डबल की बजाय एकल-परिशुद्धता का उपयोग कर रहे हैं, तो आप उस पर विचार कर सकते हैं। पोस्टिंग कोड हमें उस पर भी मदद करेगा।

कोड पोस्ट होने के बाद मेरे उत्तर का विस्तार करने में खुशी हुई।

+0

क्या वे दोनों आईईईई चश्मा का अनुपालन नहीं करते हैं? मुझे लगता है कि दोनों पर 'एकल प्रेसिजन' का उपयोग करना एक ही परिणाम उत्पन्न करना चाहिए। फिर, गणना के आदेश को मानना ​​भी वही है। – Royi

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