對於intel的AES-NI新指令集,需要i5處理器及以上的相關硬件支持.在編譯時,可能會出現
/usr/lib/gcc/x86_64-linux-gnu/4.8/include/wmmintrin.h:34:3: error: #error "AES/PCLMUL instructions not enabled"
很顯然,可以通過查其頭文件,定位到
#if !defined (__AES__) && !defined (__PCLMUL__) # error "AES/PCLMUL instructions not enabled" #else
那么,很明顯是因為沒有定義兩個宏.問題正因找到了,怎么解決呢?
對於gcc/g++編譯器,需要添加編譯選項-maes和-mpclmul;
對於vs系列,根據microsoft官網介紹,最低版本要求為visual studio 2010及以上
而對於下列問題:
error: request for member ‘m128i_u64’ in ‘a’, which is of non-class type ‘__m128i {aka __vector(2) long long int}’
a.1] = 0x8899AABBCCDDEEFF;(其中__m128i a;)
主要是對於變量a,在vs2010中,存在結構體成員a.m128i_u64[0],a.m128i_u64[1],而對於gcc/g++,存在a[0],a[1].這一點需要注意的.
下面是幾個問題,也許你在學習中會遇到,現總結如下:
1.如何判斷當前系統是否支持aes-ni指令集?
方法一:
$ sort -u /proc/crypto | grep module
module : aesni_intel
module : aes_x86_64
module : arc4
module : crc32_pclmul
module : crct10dif_pclmul
module : ghash_clmulni_intel
module : kernel
方法二:對於這個方法,需要安裝cpuid。
$ cpuid | grep -i aes
AES instruction = true
AES instruction = true
AES instruction = true
AES instruction = true
附文:
查看cpu信息
$ cat /proc/cpuinfo
$ lscpu
方法三:intel官網說這種方法不太可靠
$ cat /proc/cpuinfo| grep aes
$grep aes /proc/cpuinfo
flags: ***** aes *****
2.linux下openssl使用aes-ni與否,對數據處理的速度比較?
$ openssl speed -elapsed -evp aes-128-cbc
$ OPENSSL_ia32cap="~0x200000200000000" openssl speed -elapsed -evp aes-128-cbc
openssl支持aes-ni指令集,但並沒有將其作為一個engine.因此,為了支持aes-ni指令集,在openssl中需要添加
-evp
(“envelope”) mode模塊.
3.#error "SSE4.1 instruction set not enabled"或者說如何添加SSE4.1指令集?
給gcc或者g++編譯器添加flags: -march=native or -msse2 / -msse3 / -mssse3 / -msse4.1
注意:使用-march=native編譯選項時,編譯器會根據處理器選擇最好的CPU架構和flags。或者對於distcc,直接食用-march=corei7 -mavx -mpclmul。
CFLAGS+= -msse4.1
通過以上總結:
$ g++ -std=c++11 -maes -mpclmul -msse4.1 main.cpp -o main
$ g++ -Wall -std=c++11 -march=native main.cpp -o main
4.Debian/Ubuntu安裝openssl及開發庫
$ sudo apt-get install openslllibssl-dev
在ubuntu14.0下libssl.so和libcrypto.so位於/lib/x86_64-linux-gnu,默認的linux共享庫搜索路徑為/lib和/usr/lib兩個目錄(不包含子目錄),
若共享庫不在這兩個路徑,不能自動連接到(最典型的就是/usr/local/lib)。
所以提供一種通用方法:修改系統文件/etc/ld.so.conf,添加路徑,運行ldconfig命令。