在 OSX 10.14.5 上安装 clickhouse-cityhash 时缺少指令"_mm_crc32_u

Missing instruction `_mm_crc32_u64` when installing clickhouse-cityhash on OSX 10.14.5

本文关键字:quot 指令 crc32 mm OSX clickhouse-cityhash 安装      更新时间:2023-10-16

我正在尝试在 OSX 10.14.5 上安装clickhouse-cityhash带有pip但失败并显示以下(删节)输出:

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=gccCC=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

在我试图理解这个问题的过程中,我查看了源代码,我可以看到四个对_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);                                    

我在英特尔内在指南中找到了对_mm_crc32_u64的引用,所以我的理解是,它是一个英特尔内在指令作为 C 函数,是 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.1SSE4.2 x2APICMOVBE POPCNT AES PCID XSAVE OSXSAVE SEGLIM64 TSCTMR AVX1.0 RDRAND F16C

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

如果没有,我能做些什么来提供这些说明?

非常感谢@PeterCordes在上面的问题评论中提出的非常有价值的观察!


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

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

因此,一种解决方案是不使用苹果叮当声。

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

检查以下内容:

brew list | grep gcc

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

brew install gcc

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

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

CC=gcc-8 pip install clickhouse-cityhash

希望这对:)有所帮助