在OSX 10.14.5上安装clickhousecityhash时缺少指令“\u mm\u crc32\u u64”

2024-04-25 10:18:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图在OSX 10.14.5上安装带有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

为了理解这个问题,我查看了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可用吗?如果是的话,这个错误的可能原因是什么?你知道吗

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


Tags: 命令srccityerrorcommonccmmchunk
1条回答
网友
1楼 · 发布于 2024-04-25 10:18:49

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


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

不过,这似乎并不是苹果当当的默认行为。如果生成32位代码,那么_mm_crc32_u32将是可用的最大CRC,这意味着_mm_crc32_u64没有定义。你知道吗

因此,一个解决方案是不使用Apple-clang。你知道吗

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

检查以下各项:

brew list | grep gcc

如果没有,请安装:

brew install gcc

可执行文件应该可以在$PATH(通常在/usr/local/bin)中作为gcc使用,或者类似的文件可以作为gcc-8使用。你知道吗

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

CC=gcc-8 pip install clickhouse-cityhash

希望这有帮助:)

相关问题 更多 >