मैं, सरल प्रयोग किया जाता अनुभवहीन चार खोज खोज कर दोनों सीपीयू और 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 फ्रेम पर कब्जा रूपरेखा परिणाम:
कोड के स्क्रीनशॉट पेस्ट न करें। वे मूल रूप से बेकार हैं ... वास्तविक कोड काट और पेस्ट करें। –
@MarcB I ने github gist के साथ स्क्रीनशॉट को बदल दिया। उम्मीद है कि यह ठीक है (कोड के उस हिस्से को ठीक से प्रारूपित करने में बड़ी समस्या थी)। – Lukasz
पहली चीज जो मैं कोशिश करूंगा वह खोज को स्थानांतरित करने के लिए डिवाइस स्मृति को स्थानांतरित करना है। ऐप्पल कहते हैं कि सरणी के लिए निरंतर स्थान का उपयोग न करें। अगर हम कुछ भी करते हैं तो हमें बताएं। – Jessy