【问题标题】:How can I check if my installed numpy is compiled with SSE/SSE2 instruction set?如何检查我安装的 numpy 是否使用 SSE/SSE2 指令集编译?
【发布时间】:2013-06-11 03:46:39
【问题描述】:

如何检查我安装的 numpy 版本是否使用 SSE/SSE2 指令集编译? 我知道numpy的某些部分正在使用BLAS,如何检查BLAS呢?

【问题讨论】:

    标签: python numpy sse


    【解决方案1】:

    看看:

    import numpy.distutils.system_info as sysinfo
    sysinfo.show_all()
    

    这将打印出有关 numpy 编译对象的所有信息。

    【讨论】:

    • 这没有回答问题,因为它不会递归地检查任何依赖关系。
    【解决方案2】:

    如果您在 linux 下,我认为一种方法是在 numpy.so 文件上使用 objdump,然后使用 grep 获取特定于 sse 的指令。

    对于 SSE3 (http://en.wikipedia.org/wiki/SSE3):

    objdump -d  /usr/lib/pyshared/python2.7/numpy/core/*.so | grep -i MOVDDUP
    

    对于 SSE2 (http://fr.wikipedia.org/wiki/Jeu_d%27instructions_x86#Instructions_SSE2):

    objdump -d  /usr/lib/pyshared/python2.7/numpy/core/*.so | grep -i ADDPD
    

    如果您使用 grep 得到一些结果,则意味着二进制文件已使用 SSE 标志编译。

    【讨论】:

    • 在我的系统(Ubuntu 14.04 的衍生版本)中,这些文件是 /usr/lib/python2.7/dist-packages/numpy/core/*.so
    • 找到你的 numpy 位置:python3 -c "import numpy; print(numpy.__file__)"
    • 针对指令集中的单个指令进行检查不是很可靠。此外,这将与 AVX 指令 VADDPDVMOVDDUP 匹配。我在回答中改进了您的解决方案。
    【解决方案3】:

    首先,找到numpy/core.so文件的路径:

    python -c "import numpy, os; print (os.path.join(os.path.dirname(numpy.__file__), 'core/*.so'))"
    #  Output:  /usr/local/lib/python2.7/dist-packages/numpy/core/*.so 
    

    然后将numpy的core反编译成文件numpy.asm:

    objdump -d /usr/local/lib/python2.7/dist-packages/numpy/core/*.so > numpy.asm
    

    然后找到所有 SSE指令:

    gawk 'BEGIN { IGNORECASE = 1 } /\<(ADDPS|ADDSS|ANDNPS|ANDPS|CMPPS|CMPSS|COMISS|CVTPI2PS|CVTPS2PI|CVTSI2SS|CVTSS2S|CVTTPS2PI|CVTTSS2SI|DIVPS|DIVSS|LDMXCSR|MAXPS|MAXSS|MINPS|MINSS|MOVAPS|MOVHLPS|MOVHPS|MOVLHPS|MOVLPS|MOVMSKPS|MOVNTPS|MOVSS|MOVUPS|MULPS|MULSS|ORPS|RCPPS|RCPSS|RSQRTPS|RSQRTSS|SHUFPS|SQRTPS|SQRTSS|STMXCSR|SUBPS|SUBSS|UCOMISS|UNPCKHPS|UNPCKLPS|XORPS|PAVGB|PAVGW|PEXTRW|PINSRW|PMAXSW|PMAXUB|PMINSW|PMINUB|PMOVMSKB|PSADBW|PSHUFW)\>/' numpy.asm
    

    查找所有 SSE2 指令(MOVSD 和 CMPSD 除外,它们在 80386 中首次引入):

    gawk 'BEGIN { IGNORECASE = 1 } /\<(ADDPD|ADDSD|ANDNPD|ANDPD|CMPPD|COMISD|CVTDQ2PD|CVTDQ2PS|CVTPD2DQ|CVTPD2PI|CVTPD2PS|CVTPI2PD|CVTPS2DQ|CVTPS2PD|CVTSD2SI|CVTSD2SS|CVTSI2SD|CVTSS2SD|CVTTPD2DQ|CVTTPD2PI|CVTPS2DQ|CVTTSD2SI|DIVPD|DIVSD|MAXPD|MAXSD|MINPD|MINSD|MOVAPD|MOVHPD|MOVLPD|MOVMSKPD|MOVUPD|MULPD|MULSD|ORPD|SHUFPD|SQRTPD|SQRTSD|SUBPD|SUBSD|UCOMISD|UNPCKHPD|UNPCKLPD|XORPD|MOVDQ2Q|MOVDQA|MOVDQU|MOVQ2DQ|PADDQ|PMULUDQ|PSHUFHW|PSHUFLW|PSHUFD|PSLLDQ|PSRLDQ|PUNPCKHQDQ|PUNPCKLQDQ)\>/' numpy.asm
    

    查找所有 SSE3 指令:

    gawk 'BEGIN { IGNORECASE = 1 } /\<(ADDSUBPD|ADDSUBPS|HADDPD|HADDPS|HSUBPD|HSUBPS|MOVDDUP|MOVSHDUP|MOVSLDUP|LDDQU|FISTTP)\>/' numpy.asm
    

    查找所有 SSSE3 指令:

    gawk 'BEGIN { IGNORECASE = 1 } /\<(PSIGNW|PSIGND|PSIGNB|PSHUFB|PMULHRSW|PMADDUBSW|PHSUBW|PHSUBSW|PHSUBD|PHADDW|PHADDSW|PHADDD|PALIGNR|PABSW|PABSD|PABSB)\>/' numpy.asm
    

    查找所有 SSE4 指令:

    gawk 'BEGIN { IGNORECASE = 1 } /\<(MPSADBW|PHMINPOSUW|PMULLD|PMULDQ|DPPS|DPPD|BLENDPS|BLENDPD|BLENDVPS|BLENDVPD|PBLENDVB|PBLENDDW|PMINSB|PMAXSB|PMINUW|PMAXUW|PMINUD|PMAXUD|PMINSD|PMAXSD|ROUNDPS|ROUNDSS|ROUNDPD|ROUNDSD|INSERTPS|PINSRB|PINSRD|PINSRQ|EXTRACTPS|PEXTRB|PEXTRD|PEXTRW|PEXTRQ|PMOVSXBW|PMOVZXBW|PMOVSXBD|PMOVZXBD|PMOVSXBQ|PMOVZXBQ|PMOVSXWD|PMOVZXWD|PMOVSXWQ|PMOVZXWQ|PMOVSXDQ|PMOVZXDQ|PTEST|PCMPEQQ|PCMPGTQ|PACKUSDW|PCMPESTRI|PCMPESTRM|PCMPISTRI|PCMPISTRM|CRC32|POPCNT|MOVNTDQA|EXTRQ|INSERTQ|MOVNTSD|MOVNTSS|LZCNT)\>/' numpy.asm
    

    【讨论】:

    • 搜索标量 SSE/SSE2 指令不是很有趣。它比 x87 好一些,但真正的收益来自 SIMD addps,而不是标量 addss。顺便说一句,要检查 AVX,请搜索 %ymm 以查找 256 位向量寄存器的用途。
    • 另外,为什么用文件中的模式列表而不是egrep -ifgrep?顺便说一句,objdump -d 总是使用小写助记符。
    • @PeterCordes,没有特殊原因。您可以使用其他工具。很高兴了解 objdump。
    • 在 macOS 上使用 otool -tv 而不是 objdump -d
    猜你喜欢
    • 1970-01-01
    • 2018-06-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多