2015-05-25 13 views
10

मैं, सरल प्रयोग किया जाता अनुभवहीन चार खोज खोज कर दोनों सीपीयू और GPU पर 50 अक्षर प्रत्येक (50 मील चार नक्शा) की 1.000.000 पंक्तियों एल्गोरिथ्म को लागू करने से (का उपयोग कर iOS8 धातु गणना पाइप लाइन)।आईओएस धातु खोज कार्य के लिए गणना पाइपलाइन सीपीयू कार्यान्वयन की तुलना में धीमी

सीपीयू कार्यान्वयन सरल पाश का उपयोग करता है, धातु कार्यान्वयन प्रक्रिया के लिए प्रत्येक कर्नेल 1 पंक्ति देता है (नीचे स्रोत कोड)।

मेरे आश्चर्य के लिए, धातु कार्यान्वयन साधारण, रैखिक सीपीयू (यदि मैं 1 कोर का उपयोग करता हूं) की तुलना में औसत 2-3 गुना धीमा होता हूं और 3-4 बार धीमा होता है तो मैं 2 कोर (प्रत्येक डेटाबेस का आधा खोज करता हूं) ! मैंने प्रति समूह अलग-अलग धागे (16, 32, 64, 128, 512) के साथ प्रयोग किया है, फिर भी अभी भी बहुत ही समान परिणाम मिलते हैं।

iPhone 6:

CPU 1 core: approx 0.12 sec 
CPU 2 cores: approx 0.075 sec 
GPU: approx 0.35 sec (relEase mode, validation disabled) 

मैं धातु शेडर स्मृति (देखें नीचे) तक पहुँचने का 90% से अधिक खर्च कर देख सकते हैं।

क्या यह अनुकूलन करने के लिए किया जा सकता है?

किसी भी अंतर्दृष्टि की सराहना की जाएगी, क्योंकि इंटरनेट में कई स्रोत नहीं हैं (मानक ऐप्पल प्रोग्रामिंग गाइड के अलावा), मेमोरी एक्सेस इंटर्नल्स पर विवरण प्रदान करते हुए & धातु ढांचे के लिए विशिष्ट व्यापार-बंद।

धातु कार्यान्वयन विवरण:

होस्ट कोड सार: https://gist.github.com/lukaszmargielewski/0a3b16d4661dd7d7e00d

कर्नेल (शेडर) कोड: https://gist.github.com/lukaszmargielewski/6b64d06d2d106d110126

GPU फ्रेम पर कब्जा रूपरेखा परिणाम:

enter image description here

+7

कोड के स्क्रीनशॉट पेस्ट न करें। वे मूल रूप से बेकार हैं ... वास्तविक कोड काट और पेस्ट करें। –

+0

@MarcB I ने github gist के साथ स्क्रीनशॉट को बदल दिया। उम्मीद है कि यह ठीक है (कोड के उस हिस्से को ठीक से प्रारूपित करने में बड़ी समस्या थी)। – Lukasz

+0

पहली चीज जो मैं कोशिश करूंगा वह खोज को स्थानांतरित करने के लिए डिवाइस स्मृति को स्थानांतरित करना है। ऐप्पल कहते हैं कि सरणी के लिए निरंतर स्थान का उपयोग न करें। अगर हम कुछ भी करते हैं तो हमें बताएं। – Jessy

उत्तर

0

मैं अपने अनुमान भी ले जाऊंगा, जीपीयू को/अन्य के लिए अनुकूलित नहीं किया गया है, यह शाखाओं की भविष्यवाणी नहीं करता है (यह शायद दोनों निष्पादित करता है), किसी भी सशर्त के बिना एल्गोरिदम को अधिक रैखिक तरीके से फिर से लिखने का प्रयास करें या उन्हें कम करें न्यूनतम।

+0

प्रोफाइलिंग टूल स्पष्ट रूप से दिखाए जाते हैं (संलग्न स्क्रीनशॉट पर दिखाई देते हैं) कि यह बाधा नहीं है। मेमोरी एक्सेस पर 90% से अधिक समय व्यतीत किया जाता है। – Lukasz

3

जीपीयू शेडर स्मृति के माध्यम से लंबवत रूप से आगे बढ़ रहा है, जबकि सीपीयू क्षैतिज रूप से आगे बढ़ रहा है। जब आप charTable पढ़ते हैं तो अपने शेडर में लॉकस्टेप में निष्पादित प्रत्येक थ्रेड द्वारा वास्तव में कम या ज्यादा समेकित पते पर विचार करें। यदि आपका charTable मैट्रिक्स ट्रांसफर किया गया है तो GPU शायद एक अच्छा सौदा चलाएगा।

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

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