2017-10-01 19 views
5

Rijndael key schedule procedureRotWord, SubWord, और XOR है, जो सभी _mm_aeskeygenassist_si128 द्वारा समर्थित हैं शामिल है:एसएसई में एईएस पूर्ण कार्य क्यों नहीं प्रदान करता है?

X3[31:0] ← SRC [127: 96]; 
X2[31:0] ← SRC [95: 64]; 
X1[31:0] ← SRC [63: 32]; 
X0[31:0] ← SRC [31: 0]; 
RCON[31:0] ← ZeroExtend(Imm8[7:0]); 
DEST[31:0] ← SubWord(X1); 
DEST[63:32 ] ← RotWord(SubWord(X1)) XOR RCON; 
DEST[95:64] ← SubWord(X3); 
DEST[127:96] ← RotWord(SubWord(X3)) XOR RCON; 
DEST[VLMAX-1:128] (Unmodified) 

हालांकि, यह एक पूरा दौर कुंजी वापस नहीं करता है। उदाहरण के लिए, बजाय बस

DEST[31:0] <- SubWord(X1),

निष्पादन के लिए मुझे लगता है कि हम वास्तव में प्रदर्शन करना चाहिए

DEST[31:0]<-RotWord(SubWord(X3)) XOR RCON XOR X0

नतीजतन, _mm_aeskeygenassist_si128 के बाद, हम डेवलपर्स के लिए कुछ अतिरिक्त काम करने के लिए पहले दौर कुंजी पूरी तरह से उत्पन्न होता है की है।

क्यों SSE एक पूरा एईएस कुंजी पीढ़ी प्रक्रिया प्रदान नहीं करते हैं?

उत्तर

6

इंटेल एईएस एनआई श्वेतपत्र में Key Expansion Using AESKEYGENASSIST (page 23) देखें। वे इंगित करते हैं कि निर्देश को विभिन्न प्रमुख आकारों के लिए बिल्डिंग ब्लॉक के रूप में उपयोग किया जा सकता है: 128/192/256। वे केवल 128 बी के लिए एक उदाहरण दिखाते हैं, जैसा कि आप वर्णन करते हैं, प्रत्येक aeskeygenassist निर्देश के बाद फ़ंक्शन कॉल के साथ अतिरिक्त कार्य कर रहे हैं।

AESKEYGENASSIST पहले से ही सूक्ष्म कोडित है (उदाहरण के Skylake पर 13 UOPs बनाम केवल के लिए 1 AESDEC/AESENC (http://agner.org/optimize/)) है, इसलिए विभिन्न निर्देश है कि पिछले कुछ चरणों में विभिन्न कुंजी के आकार नहीं होगा के लिए अलग हैं कर होने यह वर्तमान में लागू होने के तरीके से बहुत तेजी से चलता है।

स्किलेक में 1 प्रति 12 चक्र aeskeygenassist थ्रूपुट है, लेकिन नेहलेम में 1 प्रति 2 चक्र था, जैसा aesenc था। तो नेहलेम में, मुझे लगता है कि उन्होंने इसे ज्यादातर समर्पित हार्डवेयर में लागू किया है। यही कारण है कि शायद स्पष्टीकरण के अन्य भाग है: अधिक कदम पहले पीढ़ी कार्यान्वयन में अधिक हार्डवेयर ले लिया होता, या कि शिक्षा सूक्ष्म कोडित (जो यह शायद Nehalem में नहीं था) और अधिक UOPs साथ अतिरिक्त कदम करने के लिए बनाया है।

इंटेल स्पष्ट रूप से नहीं लगता है कि की-स्थापना, प्रदर्शन के लिए महत्वपूर्ण है क्योंकि जैसा कि मैंने कहा वे Nehalem के बाद aeskeygenassist के प्रदर्शन कम कर दिया। (यहां तक ​​कि Sandybridge यह 1 प्रति 8 घड़ी प्रवाह क्षमता के साथ microcoded था।)


अलग keysizes लिए विभिन्न निर्देश के बाद अधिक opcodes ले लिया होता। उस बिंदु पर, इंटेल ने अभी तक वीईएक्स उपसर्गों को पेश नहीं किया था, इसलिए एईएस निर्देशों पर अधिक ऑपोड स्पेस खर्च करने से भविष्य के विस्तार के लिए कमरा कम हो गया होगा। (VEX स्थान उपलब्ध कोडिंग, मौजूदा अनिवार्य-उपसर्ग वर्तमान निर्देश द्वारा इस्तेमाल किया संयोजन के लिए बहु-बिट कोड का केवल एक जोड़े का उपयोग कर के टन है।)

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