在OSX 10.14.5上安装clickhouse-cityhash时缺少指令'_mm_crc32_u64'

时间:2019-06-11 17:44:40

标签: python c++ x86-64 intrinsics clickhouse

我正在尝试在OSX 10.14.5上将pipsrc/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 进行编译,但无济于事。

在失败时运行的命令是:

_mm_crc32_u64

在试图理解问题的过程中,我查看了clickhouse-cityhash,并且看到了对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

我在source code中找到了对sysctl -a | grep cpu.features 的引用,因此我的理解是,它是作为C函数的Intel本质指令,是SSE4.2指令集的一部分。

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

_mm_crc32_u64

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 PMX EST TM2 PDCM SSE4.1 SSE4.2 x2APIC MOVBE POPCNT AES PCID XSAVE OSXSAVE SEGLIM64 TSCTMR AVX1.0 RDRAND F16C

因此,我应该期望hive.createTable("web_sales").ifNotExists().column("sold_time_sk", "bigint").column("ws_ship_date_sk", "bigint").create() 可用,如果可以,发生此错误的可能原因是什么?

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

1 个答案:

答案 0 :(得分:2)

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


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

但是,这似乎不是Apple clang的默认行为。如果生成了32位代码,则_mm_crc32_u32将提供最大的CRC,这表明未定义_mm_crc32_u64

因此,一种解决方案是不使用Apple clang。

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

请检查以下内容:

brew list | grep gcc

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

brew install gcc

可执行文件应该以{{1​​}}或类似的形式在您的$PATH(通常在/usr/local/bin中可用)而我的可执行文件应该是gcc

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

pip install

希望这会有所帮助:)