编程语言
首页 > 编程语言> > python-在OSX 10.14.5上安装clickhouse-cityhash时缺少指令’_mm_crc32_u64′

python-在OSX 10.14.5上安装clickhouse-cityhash时缺少指令’_mm_crc32_u64′

作者:互联网

我试图在OSX 10.14.5上使用pip安装clickhouse-cityhash,但它失败,并显示以下(摘要)输出:

src/city.cc:396:5: error: use of undeclared identifier '_mm_crc32_u64'
    CHUNK(1, 1); CHUNK(k0, 0);
    ^
...
fatal error: too many errors emitted, stopping now [-ferror-limit=]
  20 errors generated.
  error: command 'cc' failed with exit status 1

我也尝试通过CC = gcc和CC = g进行编译无济于事.

失败时运行的命令是:

cc -fno-strict-aliasing -fno-common \
   -dynamic -g -Os -pipe -fno-common \
   -fno-strict-aliasing -fwrapv -DENABLE_DTRACE \
   -DMACOSX -DNDEBUG -Wall -Wstrict-prototypes \
   -Wshorten-64-to-32 -DNDEBUG -g -fwrapv -Os -Wall \
   -Wstrict-prototypes -DENABLE_DTRACE -arch i386 \
   -arch x86_64 -pipe -Iinclude \
   -I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 \
   -c src/city.cc -o build/temp.macosx-10.14-intel-2.7/src/city.o \
   -O3 -msse4.2 -Wno-unused-value -Wno-unused-function

在试图理解问题的过程中,我查看了source code,我看到了对_mm_crc32_u64的四个调用,这些调用构成了错误日志中提到的CHUNK预处理器指令的一部分:

f = _mm_crc32_u64(f, a);                                    \
g = _mm_crc32_u64(g, b);                                    \
h = _mm_crc32_u64(h, c);                                    \
i = _mm_crc32_u64(i, d);                                    \
j = _mm_crc32_u64(j, e);                                    \

我在Intel Intrinsics Guide中找到了对_mm_crc32_u64的引用,因此我的理解是这是作为C函数的Intel固有指令,它是SSE4.2指令集的一部分.

我发现我的机器不包括SSE4.2指令集,但是当我运行以下命令时:

sysctl -a | grep cpu.features

SSE4.2包含在列表中:

machdep.cpu.features: FPU VME DE PSE TSC MSR PAE MCE CX8 APIC SEP MTRR PGE MCA CMOV PAT PSE36 CLFSH DS ACPI MMX FXSR SSE SSE2 SS HTT TM PBE SSE3 PCLMULQDQ DTES64 MON DSCPL VMX SMX EST TM2 SSSE3 FMA CX16 TPR PDCM SSE4.1 SSE4.2 x2APIC MOVBE POPCNT AES PCID XSAVE OSXSAVE SEGLIM64 TSCTMR AVX1.0 RDRAND F16C

因此,我应该期望_mm_crc32_u64可用,如果可以的话,此错误的可能原因是什么?

如果没有,我可以做些什么使这些说明可用?

解决方法:

非常感谢@PeterCordes在上述问题评论中的宝贵意见!

在pip安装clickhouse-cityhash期间失败的构建命令包括-arch i386标志.尽管存在此标志,x86 clang的默认行为是生成64位代码.

但是,这似乎不是Apple clang的默认行为.如果生成了32位代码,则_mm_crc32_u32将是可用的最大CRC,这意味着未定义_mm_crc32_u64.

因此,一种解决方案是不使用Apple叮当声.

大多数使用OSX的开发人员都将熟悉brew软件包管理器并进行安装.您可能会发现您已经通过brew安装了gcc版本,作为另一个软件包的依赖项.

检查以下内容:

brew list | grep gcc

如果没有安装,请使用以下命令进行安装:

brew install gcc

该可执行文件应该在您的$PATH中(通常在/usr/local/bin中)以gcc或类似形式可用-我的以gcc-8形式可用.

要使用它,只需定义要与CC envvar一起使用的gcc并运行pip install;例如:

CC=gcc-8 pip install clickhouse-cityhash

希望这可以帮助 :)

标签:x86-64,intrinsics,clickhouse,python,c-4
来源: https://codeday.me/bug/20191210/2104311.html