在 OSX 10.14.5 上安装 clickhouse-cityhash 时缺少指令"_mm_crc32_u
Missing instruction `_mm_crc32_u64` when installing clickhouse-cityhash on OSX 10.14.5
我正在尝试在 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=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
的调用,这些调用构成了错误日志中提到的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
可用。
要使用,只需定义要与CC
envvar 一起使用的gcc
并运行pip install
;例如:
CC=gcc-8 pip install clickhouse-cityhash
希望这对:)有所帮助
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- C++:对不存在的命名空间使用命名空间指令
- 函数名是c中该函数的第一条指令的地址吗
- 错误:无效的预处理指令 #i 的意思是 #if?
- 组装指令中乘法的下部和上部是什么
- OpenMP 与有序和关键指令并行
- C++中的移动分配出现问题.非法指令: 4.
- 嵌套命名空间的"using"指令,但需要命名内部命名空间
- C++CMake编译指令与
- 使用宏扩展的泛型:为什么指令缓存使用不当?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- AVX 指令中寄存器和指针之间的客观差异
- while 循环 c++ 中的非法指令
- 如何在编译时定义C++预处理器指令的值?
- 存储指令是否会阻止缓存未命中的后续指令?
- 保证编译器指令在C++中重新排序
- VS2008中的AVX-512指令库
- 令人困惑的定义指令在C ++项目中
- 是否有用于元素部分移位的 simd 指令/内在/内置指令?