Отсутствует инструкция `_mm_crc32_u64` при установке clickhouse-cityhash в OSX 10.14.5 - PullRequest
3 голосов
/ 11 июня 2019

Я пытаюсь установить clickhouse-cityhash с pip в OSX 10.14.5, но он не работает со следующим (сокращенным) выводом:

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 в Intel Intrinsics Guide , поэтому я понимаю, что это Intel Intrinsic Instruction в виде функции C, которая является частью набора инструкций SSE4.2.

Я подумал, что моя машина не включаетнабор инструкций SSE4.2, но когда я запускаю следующую команду:

sysctl -a | grep cpu.features

SSE4.2 включается в список:

machdep.cpu.features: FPU VMEDE PSE TSC MSR PAE MCE CX8 APIC SEP MTRR PGE MCA CMOV PAT PSE36 CLFSH DS ACPI MMX FXSR SSE, SSE2, СС НТТ ТМ РВЕ SSE3 PCLMULQDQ DTES64 ПН DSCPL VMX SMX EST ТМ2 SSSE3 ФМА CX16 ТПВ PDCM SSE4.1 SSE4.2 * * 1 034 x2APIC MOVBE POPCNT AES PCID XSAVE OSXSAVE SEGLIM64 TSCTMR AVX1.0 RDRAND F16C * +1035 *

Следовательно, я должен ожидать, что _mm_crc32_u64 будет доступен, и если да, какова вероятная причина этой ошибки?

Если нет, могу ли я что-нибудь сделать для выполнения этих инструкцийдоступны

1 Ответ

2 голосов
/ 12 июня 2019

Большое спасибо @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

Исполняемый файл должен быть доступен в вашем $PATH (обычно в /usr/local/bin) как gcc или аналогичный - мой был доступен как gcc-8.

Дляиспользуйте, просто определите gcc, который вы хотите использовать с CC envvar, и запустите pip install;Например:

CC=gcc-8 pip install clickhouse-cityhash

Надеюсь, это поможет:)

...