Как получить доступ к новым инструкциям по работе с битами x86 из Common Lisp?

Я хочу использовать новые инструкции по обработке битов, доступные в новейших чипах Intel и AMD, в частности инструкцию «Извлечение параллельных битов» PEXT (см. здесь и здесь). Как я могу получить доступ к этим инструкциям из Common Lisp? (в частности, SBCL).

В идеале я хотел бы получить доступ к этим инструкциям через библиотеку, которая определяет, предоставляет ли их ЦП, и, если нет, эмулирует их в программном обеспечении. Компиляторы для других языков предоставляют такие функции (например, GCC предоставляет функцию _pext_u32; см. здесь).


person scaramouche    schedule 15.07.2018    source источник


Ответы (2)


Я думаю, что для того, чтобы на самом деле добавить поддержку, вам нужно изменить сам компилятор. Это может включать что-то вроде добавления новой VOP (см. vop.lisp в исходниках sbcl), определения новой функции, которая компилируется в нее (возможно, в пакете sb-ext) и ее подключения. На самом деле я не могу сказать вам, как это сделать, мое понимание этого поверхностно.

Другой способ, который может быть более переносимым, — создать библиотеку C, содержащую функции, использующие новый примитив в ассемблере, а затем поместить ее в привязку CFFI.

person Svante    schedule 15.07.2018
comment
Спасибо. Это интересные подходы, но проблема с ними заключается в том, что (а) модификация vop.lisp не очень переносима, а CFFI добавляет накладные расходы (я хочу использовать инструкцию PEXT во внутреннем цикле, который выполняется миллиарды раз). Было бы идеально, если бы SBCL допускал встроенный ассемблерный код. - person scaramouche; 19.07.2018
comment
Я думаю, что только что нашел жизнеспособный подход здесь: pvk.ca/Blog/2014/08/16/how-to-define-new-intrinsics-in-sbcl - person scaramouche; 19.07.2018

Существует переменная (по крайней мере, в CMU Common Lisp, ответвлением которого является Steel Bank) с именем *features*, в которой содержится некоторая информация о системе, в которой работает Lisp. Мой выглядит так:

(:GERDS-PCL :PCL-STRUCTURES :PORTABLE-COMMONLOOPS :PCL :CMU21 :CMU21B :PYTHON
 :MODULAR-ARITH :MP :X86 :RELOCATABLE-STACKS :SSE2 :LINKAGE-TABLE
 :RELATIVE-PACKAGE-NAMES :EXECUTABLE :MACH-O :DARWIN :BSD :UNIX :RANDOM-MT19937
 :GENCGC :CMUCL :UNICODE :COMPLEX-FP-VOPS :HASH-NEW :ALIEN-CALLBACK
 :DOUBLE-DOUBLE :HEAP-OVERFLOW-CHECK :STACK-CHECKING :COMMON-LISP :ANSI-CL
 :IEEE-FLOATING-POINT :CMU)

Это может сказать вам то, что вам нужно знать. Если нет, попробуйте найти что-нибудь с (apropos 'feature), и это должно отобразить список символов с «функцией» в них.

person Ashton Wiersdorf    schedule 15.07.2018
comment
Эта переменная действительно есть в SBCL, но, похоже, она не показывает возможности процессора (например, в моем выводе нет SSE2). В любом случае, знание функций ЦП полезно, но оно не дает ответа на вопрос (о том, как вызвать данную инструкцию ЦП из Common Lisp). - person scaramouche; 15.07.2018
comment
функции на самом деле говорят только о том, какая поддержка компилятора и библиотеки у вас есть на момент просмотра списка. - person Vatine; 18.07.2018