यहां एक monotonic काउंटर है। मुझे यकीन नहीं है कि अगर आप इसे सरल कह सकते हैं।
मानते हैं कि ONE
और ZERO
दोनों पंजीयक में हैं, तो यह 5 निर्देशों को संकलित करना चाहिए। (7 या 8 यदि VEX एन्कोडिंग नहीं किया जाता है)
inline __m128i nextc(__m128i x){
const __m128i ONE = _mm_setr_epi32(1,0,0,0);
const __m128i ZERO = _mm_setzero_si128();
x = _mm_add_epi64(x,ONE);
__m128i t = _mm_cmpeq_epi64(x,ZERO);
t = _mm_and_si128(t,ONE);
t = _mm_unpacklo_epi64(ZERO,t);
x = _mm_add_epi64(x,t);
return x;
}
टेस्ट संहिता (MSVC):
int main() {
__m128i x = _mm_setr_epi32(0xfffffffa,0xffffffff,1,0);
int c = 0;
while (c++ < 10){
cout << x.m128i_u64[0] << " " << x.m128i_u64[1] << endl;
x = nextc(x);
}
return 0;
}
आउटपुट:
18446744073709551610 1
18446744073709551611 1
18446744073709551612 1
18446744073709551613 1
18446744073709551614 1
18446744073709551615 1
0 2
1 2
2 2
3 2
थोड़ा बेहतर संस्करण ने सुझाव दिया @ नॉरबर्ट पी। यह मेरे मूल समाधान पर 1 निर्देश बचाता है।
inline __m128i nextc(__m128i x){
const __m128i ONE = _mm_setr_epi32(1,0,0,0);
const __m128i ZERO = _mm_setzero_si128();
x = _mm_add_epi64(x,ONE);
__m128i t = _mm_cmpeq_epi64(x,ZERO);
t = _mm_unpacklo_epi64(ZERO,t);
x = _mm_sub_epi64(x,t);
return x;
}
आपको 2^128 मूल्यों पर जाने की आवश्यकता क्यों है? पृथ्वी पर कोई कंप्यूटर ऐसा करने में सक्षम नहीं है। क्या आप 64-बिट int का उपयोग नहीं कर सकते? – usr
सहमत हैं, गीगाहर्ट्ज के आदेश पर घड़ी की गति के साथ एक प्रोसेसर पर, आप 64-बिट काउंटर समाप्त होने से लगभग 584 साल के लिए प्रत्येक चक्र को एक नंबर का उपभोग कर सकते हैं। – Damon