मैं परीक्षण कर रहा हूं कि मैं RyuJIT के साथ सिम निर्देशों का उपयोग करने से किस प्रकार की गति प्राप्त कर सकता हूं और मुझे कुछ डिस्सेप्लर निर्देश देख रहे हैं जिनकी मुझे उम्मीद नहीं है। मैं RyuJIT टीम के केविन फ्रीई से this blog post पर कोड और एक संबंधित पोस्ट here पर कोड का आधार बना रहा हूं। यहाँ समारोह है:सिमड इंट्रिनिक्स का उपयोग करते समय इन अतिरिक्त डिस्सेप्लर निर्देश क्या हैं?
static void AddPointwiseSimd(float[] a, float[] b) {
int simdLength = Vector<float>.Count;
int i = 0;
for (i = 0; i < a.Length - simdLength; i += simdLength) {
Vector<float> va = new Vector<float>(a, i);
Vector<float> vb = new Vector<float>(b, i);
va += vb;
va.CopyTo(a, i);
}
}
disassembly की धारा मैं Vector<float>
में प्रतियां सरणी मूल्यों की क्वेरी हूँ। disassembly के अधिकांश कि केविन और साशा की पोस्ट में के समान है, लेकिन मैं कुछ अतिरिक्त निर्देश पर प्रकाश डाला गया है (मेरी उलझन में एनोटेशन के साथ) है कि उनके disassemblies में दिखाई नहीं देते:
;// Vector<float> va = new Vector<float>(a, i);
cmp eax,r8d ; <-- Unexpected - Compare a.Length to i?
jae 00007FFB17DB6D5F ; <-- Unexpected - Jump to range check failure
lea r10d,[rax+3]
cmp r10d,r8d
jae 00007FFB17DB6D5F
mov r11,rcx ; <-- Unexpected - Extra register copy?
movups xmm0,xmmword ptr [r11+rax*4+10h ]
;// Vector<float> vb = new Vector<float>(b, i);
cmp eax,r9d ; <-- Unexpected - Compare b.Length to i?
jae 00007FFB17DB6D5F ; <-- Unexpected - Jump to range check failure
cmp r10d,r9d
jae 00007FFB17DB6D5F
movups xmm1,xmmword ptr [rdx+rax*4+10h]
नोट पाश रेंज की जांच के रूप में की उम्मीद है:
;// for (i = 0; i < a.Length - simdLength; i += simdLength) {
add eax,4
cmp r9d,eax
jg loop
तो मैं क्यों eax
करने के लिए अतिरिक्त तुलना देखते हैं पता नहीं है। क्या कोई यह समझा सकता है कि मैं इन अतिरिक्त निर्देशों को क्यों देख रहा हूं और यदि उनसे छुटकारा पाना संभव है।
यदि यह परियोजना सेटिंग्स से संबंधित है तो मुझे एक बहुत ही समान प्रोजेक्ट मिल गया है जो एक ही समस्या here on github दिखाता है (FloatSimdProcessor.HwAcceleratedSumInPlace()
या UShortSimdProcessor.HwAcceleratedSumInPlaceUnchecked()
देखें)।