विधानसभा कोड की जरूरत है पाश अनुभाग में यहाँ एक नजर डालें - http://en.wikipedia.org/wiki/ARM_architecture
मूल रूप से आप की तरह कुछ चाहता हूँ:
void brighten(unsigned char* src, unsigned char* dst, int numPixels, int intensity) {
asm volatile (
"\t mov r3, #0\n"
"Lloop:\n"
"\t cmp r3, %2\n"
"\t bge Lend\n"
"\t ldrb r4, [%0, r3]\n"
"\t add r4, r4, %3\n"
"\t strb r4, [%1, r3]\n"
"\t add r3, r3, #1\n"
"\t b Lloop\n"
"Lend:\n"
: "=r"(src), "=r"(dst), "=r"(numPixels), "=r"(intensity)
: "0"(src), "1"(dst), "2"(numPixels), "3"(intensity)
: "cc", "r3", "r4");
}
अद्यतन:
एन डी यहाँ है कि NEON संस्करण:
void brighten_neon(unsigned char* src, unsigned char* dst, int numPixels, int intensity) {
asm volatile (
"\t mov r4, #0\n"
"\t vdup.8 d1, %3\n"
"Lloop2:\n"
"\t cmp r4, %2\n"
"\t bge Lend2\n"
"\t vld1.8 d0, [%0]!\n"
"\t vqadd.s8 d0, d0, d1\n"
"\t vst1.8 d0, [%1]!\n"
"\t add r4, r4, #8\n"
"\t b Lloop2\n"
"Lend2:\n"
: "=r"(src), "=r"(dst), "=r"(numPixels), "=r"(intensity)
: "0"(src), "1"(dst), "2"(numPixels), "3"(intensity)
: "cc", "r4", "d1", "d0");
}
तो यह नियॉन संस्करण एक समय में 8 करेगा। हालांकि यह जांच नहीं करता कि numPixels
8 तक विभाजित है, इसलिए आप निश्चित रूप से ऐसा करना चाहते हैं अन्यथा चीजें गलत हो जाएंगी! वैसे भी, यह आपको दिखाने के लिए एक शुरुआत है कि क्या किया जा सकता है। निर्देशों की एक ही संख्या पर ध्यान दें, लेकिन एक बार में आठ पिक्सेल डेटा पर कार्रवाई करें। ओह और यह वहां संतृप्ति भी है जैसा कि मुझे लगता है कि आप चाहते हैं।
इस तरह के कार्यों को ओपनजीएल ईएस और एक टुकड़ा शेडर का उपयोग करके भी कार्यान्वित किया जा सकता है। अगर यह आपकी समस्या पर लागू होता है। इससे आपको "मुक्त" के समानांतरता मिल जाएगी, जैसा कि मैट के सुझाव के रूप में नीयन के उपयोग के समान है। – Arne
ये आप निश्चित रूप से ओपनजीएल ES का उपयोग कर सकते हैं। आप जो कर रहे हैं उस पर बहुत निर्भर करता है और यदि आप इसे निर्भरता के रूप में खींचना चाहते हैं। – mattjgalloway
ओपनजीएल ईएस पर्याप्त तेज़ नहीं हो सकता है अगर उसे सीपीयू पर गणना की गई राशि वापस प्राप्त करने की आवश्यकता है। इस कार्य को कुशलता से करने के लिए आईपैड जीपीयू का निर्माण नहीं किया जाता है। – Etan