एसएसई निर्देशों के साथ फ्लोट्स का पारस्परिक (व्यस्त) कैसे ले सकता है, लेकिन केवल गैर-शून्य मानों के लिए?एसएसई: यदि शून्य नहीं है
पृष्ठभूमि 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) {
// ????
}
धन्यवाद!
अरे, यह तेज़ था। मैं अपने आप पर काम कर रहा था और तुमने मुझे मार दिया। +1 – Mysticial
धन्यवाद। क्या "तुलना" के बजाय "परीक्षण" करने का कोई तरीका है, और एक रजिस्टर सेट को शून्य से उपयोग करने से बचें? बस सोच रहा है ... – Antoine
अंतिम पंक्ति के अलावा, एक टाइपो है: इनपुट व्यंजन होना चाहिए। – Antoine