2017-09-09 25 views
5

हम कुछ स्थानों पर एक वेक्टर की अनुमति देते हैं, और हमें vec_perm अंतर्निहित के साथ उपयोग करने के लिए विशिष्ट 0 मान की आवश्यकता है। हम vec_zero() या इसी तरह का पता लगाने में सक्षम नहीं हैं, इसलिए हम जानना चाहते हैं कि हमें चीजों को कैसे संभालना चाहिए।शून्य का वीएसएक्स मूल्य कैसे प्राप्त करें?

कोड वर्तमान में दो रणनीतियों का उपयोग करता है।

__attribute__((aligned(16))) 
static const uint8_t z[16] = 
    { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }; 

const uint8x16_p8 zero = vec_ld(0, z); 

दूसरी रणनीति मुखौटा का उपयोग कर हम उपयोग करने का इरादा एक XOR है: पहली रणनीति एक वेक्टर लोड है

__attribute__((aligned(16))) 
static const uint8_t m[16] = 
    { 15,14,13,12, 11,10,9,8, 7,6,5,4, 3,2,1,0 }; 

const uint8x16_p8 mask = vec_ld(0, m); 
const uint8x16_p8 zero = vec_xor(mask, mask); 

हम शुरू नहीं किया है मानक (अभी तक) है, तो हम नहीं पता है कि एक दूसरे से बेहतर है या नहीं। पहली रणनीति एक वीएमएक्स लोड का उपयोग करती है और यह महंगा हो सकती है। दूसरी रणनीति लोड से बचाती है लेकिन डेटा निर्भरता पेश करती है।

हम शून्य का वीएसएक्स मूल्य कैसे प्राप्त करते हैं?

+0

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

+0

आप निश्चित रूप से शून्य और अन्य छोटे मानों के लिए vec_splat के तत्काल रूप का उपयोग कर सकते हैं। –

उत्तर

1

मैं सुझाव देता हूं कि संकलक इसे आपके लिए संभालने दें। बस शून्य करने के लिए आरंभ:

const uint8x16_p8 zero = {0}; 

- जो संभावना एक xor को संकलित कर देगा।

उदाहरण के लिए, एक साधारण परीक्षण:

vector char foo(void) 
{ 
    const vector char zero = {0}; 
    return zero; 
} 

मेरी मशीन पर, यह संकलित करने के लिए: तुम सिर्फ हमेशा की तरह शून्य करने के लिए वेक्टर चर आरंभ तो

0000000000000000 <foo>: 
    0: d7 14 42 f0  xxlxor vs34,vs34,vs34 
    4: 20 00 80 4e  blr 
    ... 
संबंधित मुद्दे