2012-05-15 22 views
6

एसएसई निर्देशों के साथ फ्लोट्स का पारस्परिक (व्यस्त) कैसे ले सकता है, लेकिन केवल गैर-शून्य मानों के लिए?एसएसई: यदि शून्य नहीं है

पृष्ठभूमि bellow:

मैं इतना है कि प्रत्येक आयाम ही औसत है वैक्टर की एक सरणी को सामान्य करना चाहते हैं।

float vectors[num * dim]; // input data 

// step 1. compute the sum on each dimension 
float norm[dim]; 
memset(norm, 0, dim * sizeof(float)); 
for(int i = 0; i < num; i++) for(int j = 0; j < dims; j++) 
    norm[j] += vectors[i * dims + j]; 
// step 2. convert sums to reciprocal of average 
for(int j = 0; j < dims; j++) if(norm[j]) norm[j] = float(num)/norm[j]; 
// step 3. normalize the data 
for(int i = 0; i < num; i++) for(int j = 0; j < dims; j++) 
    vectors[i * dims + j] *= norm[j]; 

अब प्रदर्शन के कारणों के लिए, मैं SSE intinsics का उपयोग कर ऐसा करना चाहते हैं: सी में इस रूप में कोडित किया जा सकता है। Setp 1 et step 3 आसान है, लेकिन मैं चरण 2 पर फंस गया हूं। पर रीरिपोकोकल लेने के लिए मुझे कोई कोड नमूना या स्पष्ट एसएसई निर्देश नहीं लगता है, तो यह शून्य नहीं है। विभाजन के लिए, _mm_rcp_ps चाल करता है, और शायद इसे एक सशर्त चाल के साथ संयोजित कर सकता है, लेकिन मास्क कैसे प्राप्त करें यह दर्शाता है कि कौन सा घटक शून्य है?

मैं, बस एल्गोरिथ्म ऊपर वर्णित करने के लिए कोड की जरूरत नहीं है समारोह 'उलटी नहीं शून्य अगर ":

__m128 rcp_nz_ps(__m128 input) { 
    // ???? 
} 

धन्यवाद!

उत्तर

11
__m128 rcp_nz_ps(__m128 input) { 
    __m128 mask = _mm_cmpeq_ps(_mm_set1_ps(0.0), input); 
    __m128 recip = _mm_rcp_ps(input); 
    return _mm_andnot_ps(mask, recip); 
} 

mask से प्रत्येक लेन या तो b111...11 करने के लिए सेट करता है, तो इनपुट शून्य, और b000...00 अन्यथा है। और -उस मास्क के साथ शून्य के साथ शून्य इनपुट के अनुरूप पारस्परिक तत्वों के तत्वों को प्रतिस्थापित नहीं करता है।

+1

अरे, यह तेज़ था। मैं अपने आप पर काम कर रहा था और तुमने मुझे मार दिया। +1 – Mysticial

+0

धन्यवाद। क्या "तुलना" के बजाय "परीक्षण" करने का कोई तरीका है, और एक रजिस्टर सेट को शून्य से उपयोग करने से बचें? बस सोच रहा है ... – Antoine

+0

अंतिम पंक्ति के अलावा, एक टाइपो है: इनपुट व्यंजन होना चाहिए। – Antoine

संबंधित मुद्दे