RGBA लिए आरजीबी परिवर्तित करने पर कुछ पिछले प्रश्नों के एक अनुवर्ती में, और ARGB लिए आरजीबी से रूपांतरण, मैं SSE साथ BGRA रूपांतरण के लिए एक आरजीबी तेजी लाने के लिए करना चाहते हैं। 32-बिट मशीन मानें, और इंट्रिनिक्स का उपयोग करना चाहेंगे। मुझे 128-बिट रजिस्टरों के साथ काम करने के लिए स्रोत और गंतव्य बफर दोनों को संरेखित करने में कठिनाई हो रही है, और अन्य समझदार वेक्टरेशन समाधानों की तलाश है।फास्ट vectorized बीजीआर को BGRA
दिनचर्या vectorized जा करने के लिए इस प्रकार है, यह प्रक्रिया के लिए फायदेमंद हो सकता है ...
void RGB8ToBGRX8(int w, const void *in, void *out)
{
int i;
int width = w;
const unsigned char *src= (const unsigned char*) in;
unsigned int *dst= (unsigned int*) out;
unsigned int invalue, outvalue;
for (i=0; i<width; i++, src+=3, dst++)
{
invalue = src[0];
outvalue = (invalue<<16);
invalue = src[1];
outvalue |= (invalue<<8);
invalue = src[2];
outvalue |= (invalue);
*dst = outvalue | 0xff000000;
}
}
यह दिनचर्या, मुख्य रूप से बड़े बनावट (512KB) के लिए इस्तेमाल किया जाता है, इसलिए यदि मैं आपरेशन के कुछ parallelize कर सकते हैं एक बार में अधिक पिक्सल। बेशक, मुझे प्रोफाइल करने की आवश्यकता होगी। :)
संपादित करें:
मेरे संकलन तर्क ...
gcc -O2 main.c
क्या आप अपने कंपाइलर के लिए अनुकूलन ध्वज का उपयोग कर रहे हैं (कौन सा?)? कंपाइलर अक्सर कोड को अनुकूलित करने का बेहतर काम करेगा, _without_ गलतता पेश करना। आपने कौन सा बेंचमार्क डेटा एकत्र किया है? –
कोई एसएसई उत्तर नहीं है, लेकिन क्या आपने 4 बार अपने लूप को अनलॉक करने का प्रयास किया है जैसे कि इनपुट हमेशा एक गठबंधन पते पर शुरू होता है? फिर आप इनपुट पिक्सेल की प्रत्येक सापेक्ष स्थिति के लिए विशिष्ट स्थानांतरण और मास्किंग के साथ, एक समय में एक मशीन शब्द इनपुट को पढ़ सकते हैं। जैसा कि दाना का उल्लेख है, यह देखने लायक है कि संकलक उच्च अनुकूलन स्तर पर कितना अच्छा प्रदर्शन करता है (बेंचमार्किंग के अलावा जेनरेट किए गए असेंबलर कोड का निरीक्षण करता है), लेकिन मुझे संदेह है कि लूप को अनलॉक करने के लिए पर्याप्त आक्रामक होगा _and_ प्रविष्टि बिंदु को विभाजित करें सभी में 'इन' के संरेखण। –
महान प्रश्न। यह जीसीसी 4.6 के साथ बस "ओ 2" (ओ ओ 3 नहीं) है। मेरा बेंचमार्क केस 1012 पुनरावृत्ति है जो 512 के साथ "चौड़ाई" अवधि के रूप में चलता है। महान उत्तरों के लिए धन्यवाद! – Rev316