2012-11-16 13 views
6

मान लीजिए मैं इस प्रकार एक 2 तत्व वेक्टर को परिभाषित करता है (पैक वैक्टर के लिए जीसीसी सिंटैक्स का उपयोग)कम्प्यूटिंग x^जीसीसी वेक्टर intrinsics साथ y

// packed vector of 2-elements 
typedef double v2d __attribute__((vector_size(sizeof(double)*2))); 

v2d x = ...; 
double y = ...; 

x[0] = pow(x[0], y) 
x[1] = pow(x[1], y) 

मैं हो, तो ऐसा करने के लिए एक तेजी से रास्ता पता करना चाहते हैं वेक्टर संचालन का उपयोग कर दो बिजली computations। आर्किटेक्चर x86-64 पर जीसीसी है और प्लेटफ़ॉर्म विशिष्ट कोड ठीक है।

+0

एक सामान्य बिजली समारोह को लागू करने के लिए मुश्किल है। वेक्टरिंग के माध्यम से एक सार्थक गति प्राप्त करने में सक्षम होने के लिए बहुत अधिक शाखा हो सकती है। लेकिन मैं बस अटकलें कर रहा हूं। – Mysticial

+0

नहीं, सिमड निर्देश सेट में कोई ऑपरेशन नहीं है जो पावर() को तेज करने की अनुमति देता है। एसएसई 2 में केवल जोड़, उप, मूल, div, max, min और sqrt है। इसके लिए एक गैर-वेक्टरिज्ड निर्देश भी नहीं है। –

+2

कुछ आशा हो सकती है यदि "y" डबल की बजाय हस्ताक्षरित int तक सीमित है। दरअसल, क्लासिक "शिफ्ट-एंड-मल्टीप्ली" एल्गोरिदम के साथ दो वेक्टर के तत्वों का समानांतर में मूल्यांकन किया जा सकता है। बस मेरा अनुमान है। –

उत्तर

5

हां, यदि आपके पास कोई विशेष मामला नहीं है (नकारात्मक संख्या, 0, 1, NaN आदि ...) ताकि कोड पथ रैखिक हो।

Here, IEEE754 डबल्स के लिए pow समारोह के लिए सामान्य कोड है यह कोई पाशन निर्माणों है, इसलिए यदि आप सभी विशेष मामलों बाहर मांस, vectorization सीधा लगता है। मज़े करो।

+2

हाहा ... मैं देखता हूं कि "मज़ेदार" से आपका क्या मतलब है। :) – Mysticial

1

आप सीधे तत्वों पर और सही विकल्प जीसीसी और आईसीसी के साथ पाश एक vectorized pow समारोह का उपयोग करेगा कर सकते हैं

#include <math.h> 
typedef double vnd __attribute__((vector_size(sizeof(double)*2))); 

vnd foo(vnd x, vnd y) { 
    #pragma omp simd 
    for(int i=0; i<2; i++) x[i] = pow(x[i], y[i]); 
    return x; 
} 

सिर्फ -O2 आईसीसी के साथ बस call __svml_pow2 उत्पन्न करता है। SVML (लघु वेक्टर मैथ लाइब्रेरी) इंटेल की वेक्टरकृत गणित पुस्तकालय है। With -Ofast -fopenmp जीसीसी बस call _ZGVbN2vv___pow_finite उत्पन्न करता है।

क्लैंग इसे सदिश नहीं करता है। के रूप में यह जब से तुम दोनों `exp()` और `लॉग()` आवश्यकता हो सकती है है

https://godbolt.org/g/pjpzFX