From 475ae5ddf87e9160b3e4e5051103ab66587b0110 Mon Sep 17 00:00:00 2001 From: Masataro Asai Date: Wed, 2 Mar 2016 19:08:15 +0900 Subject: [PATCH 1/6] texinfo no longer compile out-of-the-box, also not easy to read on a text editor --- cl-simd.md | 241 ++++++++++++++++++++++++++++++++++++++ cl-simd.texinfo | 306 ------------------------------------------------ 2 files changed, 241 insertions(+), 306 deletions(-) create mode 100644 cl-simd.md delete mode 100644 cl-simd.texinfo diff --git a/cl-simd.md b/cl-simd.md new file mode 100644 index 0000000..32679ac --- /dev/null +++ b/cl-simd.md @@ -0,0 +1,241 @@ +cl-simd +========= + +The 'cl-simd' module provides access to SSE2 instructions (which are +nowadays supported by any CPU compatible with x86-64) in the form of +_intrinsic functions_, similar to the way adopted by modern C compilers. +It also provides some lisp-specific functionality, like setf-able +intrinsics for accessing lisp arrays. + + When this module is loaded, it defines an ':sse2' feature, which can +be subsequently used for conditional compilation of code that depends on +it. Intrinsic functions are available from the 'sse' package. + + This API, with minor technical differences, is supported by both ECL +and SBCL (x86-64 only). + +SSE pack types +------------------ + +The package defines and/or exports the following types to represent +128-bit SSE register contents: + + -- Type: _sse-pack,sse_ \&optional item-type + The generic SSE pack type. + + -- Type: _int-sse-pack,sse_ + Same as '(sse-pack integer)'. + + -- Type: _float-sse-pack,sse_ + Same as '(sse-pack single-float)'. + + -- Type: _double-sse-pack,sse_ + Same as '(sse-pack double-float)'. + + Declaring variable types using the subtype appropriate for your data +is likely to lead to more efficient code (especially on ECL). However, +the compiler implicitly casts between any subtypes of sse-pack when +needed. + + Printed representation of SSE packs can be controlled by binding +'*sse-pack-print-mode*': + + -- Variable: _sse-pack-print-mode,sse_ + When set to one of ':int', ':float' or ':double', specifies the way + SSE packs are printed. A 'NIL' value (default) instructs the + implementation to make its best effort to guess from the data and + context. + +SSE array type +------------------ + + -- Type: _sse-array,sse_ element-type \&optional dimensions + Expands to a lisp array type that is efficiently supported by + AREF-like accessors. It should be assumed to be a subtype of + 'SIMPLE-ARRAY'. The type expander signals warnings or errors if it + detects that the element-type argument value is inappropriate or + unsafe. + + -- Function: _make-sse-array,sse_ dimensions \&key element-type + initial-element displaced-to displaced-index-offset + Creates an object of type 'sse-array', or signals an error. In + non-displaced case ensures alignment of the beginning of data to + the 16-byte boundary. Unlike 'make-array', the element type + defaults to (unsigned-byte 8). + + On ECL this function supports full-featured displacement. On SBCL it +has to simulate it by sharing the underlying data vector, and does not +support nonzero index offset. + +Differences from C intrinsics +--------------------------------- + +Intel Compiler, GCC and MSVC +(http://msdn.microsoft.com/en-us/library/y0dh78ez%28VS.80%29.aspx) all +support the same set of SSE intrinsics, originally designed by Intel. +This package generally follows the naming scheme of the C version, with +the following exceptions: + + * Underscores are replaced with dashes, and the '_mm_' prefix is + removed in favor of packages. + + * The 'e' from 'epi' is dropped because MMX is obsolete and won't be + supported. + + * '_si128' functions are renamed to '-pi' for uniformity and brevity. + The author has personally found this discrepancy in the original C + intrinsics naming highly jarring. + + * Comparisons are named using graphic characters, e.g. '<=-ps' for + 'cmpleps', or '/>-ps' for 'cmpngtps'. In some places the set of + comparison functions is extended to cover the full possible range. + + * Scalar comparison predicates are named like '..-ss?' for 'comiss', + and '..-ssu?' for 'ucomiss' wrappers. + + * Conversion functions are renamed to 'convert-*-to-*' and + 'truncate-*-to-*'. + + * A few functions are completely renamed: 'cpu-mxcsr' (setf-able), + 'cpu-pause', 'cpu-load-fence', 'cpu-store-fence', + 'cpu-memory-fence', 'cpu-clflush', 'cpu-prefetch-*'. + + In addition, foreign pointer access intrinsics have an additional +optional integer offset parameter to allow more efficient coding of +pointer deference, and the most common ones have been renamed and made +SETF-able: + + * 'mem-ref-ss', 'mem-ref-ps', 'mem-ref-aps' + + * 'mem-ref-sd', 'mem-ref-pd', 'mem-ref-apd' + + * 'mem-ref-pi', 'mem-ref-api', 'mem-ref-si64' + + (The '-ap*' version requires alignment.) + +Comparisons and NaN handling +-------------------------------- + +Floating-point arithmetic intrinsics have trivial IEEE semantics when +given QNaN and SNaN arguments. Comparisons have more complex behavior, +detailed in the following table: + +Single-float Double-float Condition Result for NaN QNaN traps +'=-ss', '=-ps' '=-sd', '=-pd' Equal False No +'<-ss', '<-ps' '<-sd', '<-pd' Less False Yes +'<=-ss', '<=-ps' '<=-sd', '<=-pd' Less or equal False Yes +'>-ss', '>-ps' '>-sd', '>-pd' Greater False Yes +'>=-ss', '>=-ps' '>=-sd', '>=-pd' Greater or equal False Yes +'/=-ss', '/=-ps' '/=-sd', '/=-pd' Not equal True No +'/<-ss', '/<-ps' '/<-sd', '/<-pd' Not less True Yes +'/<=-ss', '/<=-sd', Not less or equal True Yes +'/<=-ps' '/<=-pd' +'/>-ss', '/>-ps' '/>-sd', '/>-pd' Not greater True Yes +'/>=-ss', '/>=-sd', Not greater or equal True Yes +'/>=-ps' '/>=-pd' +'cmpord-ss', 'cmpord-sd', Ordered, i.e. no NaN False No +'cmpord-ps' 'cmpord-pd' args +'cmpunord-ss', 'cmpunord-sd', Unordered, i.e. with True No +'cmpunord-ps' 'cmpunord-pd' NaN args + + Likewise for scalar comparison predicates, i.e. functions that +return the result of the comparison as a Lisp boolean instead of a +bitmask sse-pack: + +Single-float Double-float Condition Result for NaN QNaN traps +'=-ss?' '=-sd?' Equal True Yes +'=-ssu?' '=-sdu?' Equal True No +'<-ss?' '<-sd?' Less True Yes +'<-ssu?' '<-sdu?' Less True No +'<=-ss?' '<=-sd?' Less or equal True Yes +'<=-ssu?' '<=-sdu?' Less or equal True No +'>-ss?' '>-sd?' Greater False Yes +'>-ssu?' '>-sdu?' Greater False No +'>=-ss?' '>=-sd?' Greater or equal False Yes +'>=-ssu?' '>=-sdu?' Greater or equal False No +'/=-ss?' '/=-sd?' Not equal False Yes +'/=-ssu?' '/=-sdu?' Not equal False No + + Note that MSDN specifies different return values for the C +counterparts of some of these functions when called with NaN arguments, +but that seems to disagree with the actually generated code. + +Simple extensions +--------------------- + +This module extends the set of basic intrinsics with the following +simple compound functions: + + * 'neg-ss', 'neg-ps', 'neg-sd', 'neg-pd', 'neg-pi8', 'neg-pi16', + 'neg-pi32', 'neg-pi64': + + implement numeric negation of the corresponding data type. + + * 'not-ps', 'not-pd', 'not-pi': + + implement bitwise logical inversion. + + * 'if-ps', 'if-pd', 'if-pi': + + perform element-wise combining of two values based on a boolean + condition vector produced as a combination of comparison function + results through bitwise logical functions. + + The condition value must use all-zero bitmask for false, and + all-one bitmask for true as a value for each logical vector + element. The result is undefined if any other bit pattern is used. + + N.B.: these are _functions_, so both branches of the conditional + are always evaluated. + + The module also provides symbol macros that expand into expressions +producing certain constants in the most efficient way: + + * 0.0-ps 0.0-pd 0-pi for zero + + * true-ps true-pd true-pi for all 1 bitmask + + * false-ps false-pd false-pi for all 0 bitmask (same as zero) + +Lisp array accessors +------------------------ + +In order to provide better integration with ordinary lisp code, this +module implements a set of AREF-like memory accessors: + + * '(ROW-MAJOR-)?AREF-PREFETCH-(T0|T1|T2|NTA)' for cache prefetch. + + * '(ROW-MAJOR-)?AREF-CLFLUSH' for cache flush. + + * '(ROW-MAJOR-)?AREF-[AS]?P[SDI]' for whole-pack read & write. + + * '(ROW-MAJOR-)?AREF-S(S|D|I64)' for scalar read & write. + + (Where A = aligned; S = aligned streamed write.) + + These accessors can be used with any non-bit specialized array or +vector, without restriction on the precise element type (although it +should be declared at compile time to ensure generation of the fastest +code). + + Additional index bound checking is done to ensure that enough bytes +of memory are accessible after the specified index. + + As an exception, ROW-MAJOR-AREF-PREFETCH-* does not do any range +checks at all, because the prefetch instructions are officially safe to +use with bad addresses. The AREF-PREFETCH-* and *-CLFLUSH functions do +only ordinary index checks without the usual 16-byte extension. + +Example +----------- + +This code processes several single-float arrays, storing either the +value of a*b, or c/3.5 into result, depending on the sign of mode: + + (loop for i from 0 below 128 by 4 + do (setf (aref-ps result i) + (if-ps (<-ps (aref-ps mode i) 0.0-ps) + (mul-ps (aref-ps a i) (aref-ps b i)) + (div-ps (aref-ps c i) (set1-ps 3.5))))) + + As already noted above, both branches of the if are always evaluated. diff --git a/cl-simd.texinfo b/cl-simd.texinfo deleted file mode 100644 index 41c862a..0000000 --- a/cl-simd.texinfo +++ /dev/null @@ -1,306 +0,0 @@ -@node cl-simd -@section cl-simd -@cindex SSE2 Intrinsics -@cindex Intrinsics, SSE2 - -The @code{cl-simd} module provides access to SSE2 instructions -(which are nowadays supported by any CPU compatible with x86-64) -in the form of @emph{intrinsic functions}, similar to the way -adopted by modern C compilers. It also provides some lisp-specific -functionality, like setf-able intrinsics for accessing lisp arrays. - -When this module is loaded, it defines an @code{:sse2} feature, -which can be subsequently used for conditional compilation of -code that depends on it. Intrinsic functions are available from -the @code{sse} package. - -This API, with minor technical differences, is supported by both -ECL and SBCL (x86-64 only). - -@menu -* SSE pack types:: -* SSE array type:: -* Differences from C intrinsics:: -* Comparisons and NaN handling:: -* Simple extensions:: -* Lisp array accessors:: -* Example:: -@end menu - -@node SSE pack types -@subsection SSE pack types - -The package defines and/or exports the following types to -represent 128-bit SSE register contents: - -@anchor{Type sse:sse-pack} -@deftp {Type} @somepkg{sse-pack,sse} @&optional item-type -The generic SSE pack type. -@end deftp - -@anchor{Type sse:int-sse-pack} -@deftp {Type} @somepkg{int-sse-pack,sse} -Same as @code{(sse-pack integer)}. -@end deftp - -@anchor{Type sse:float-sse-pack} -@deftp {Type} @somepkg{float-sse-pack,sse} -Same as @code{(sse-pack single-float)}. -@end deftp - -@anchor{Type sse:double-sse-pack} -@deftp {Type} @somepkg{double-sse-pack,sse} -Same as @code{(sse-pack double-float)}. -@end deftp - -Declaring variable types using the subtype appropriate -for your data is likely to lead to more efficient code -(especially on ECL). However, the compiler implicitly -casts between any subtypes of sse-pack when needed. - -Printed representation of SSE packs can be controlled -by binding @code{*sse-pack-print-mode*}: - -@anchor{Variable sse:*sse-pack-print-mode*} -@defvr {Variable} @somepkg{@earmuffs{sse-pack-print-mode},sse} -When set to one of @code{:int}, @code{:float} or -@code{:double}, specifies the way SSE packs are -printed. A @code{NIL} value (default) instructs -the implementation to make its best effort to -guess from the data and context. -@end defvr - -@node SSE array type -@subsection SSE array type - -@anchor{Type sse:sse-array} -@deftp {Type} @somepkg{sse-array,sse} element-type @&optional dimensions -Expands to a lisp array type that is efficiently -supported by AREF-like accessors. -It should be assumed to be a subtype of @code{SIMPLE-ARRAY}. -The type expander signals warnings or errors if it detects -that the element-type argument value is inappropriate or unsafe. -@end deftp - -@anchor{Function sse:make-sse-array} -@deffn {Function} @somepkg{make-sse-array,sse} dimensions @&key element-type initial-element displaced-to displaced-index-offset -Creates an object of type @code{sse-array}, or signals an error. -In non-displaced case ensures alignment of the beginning of data to -the 16-byte boundary. -Unlike @code{make-array}, the element type defaults to (unsigned-byte 8). -@end deffn - -On ECL this function supports full-featured displacement. -On SBCL it has to simulate it by sharing the underlying -data vector, and does not support nonzero index offset. - -@node Differences from C intrinsics -@subsection Differences from C intrinsics - -Intel Compiler, GCC and -@url{http://msdn.microsoft.com/en-us/library/y0dh78ez%28VS.80%29.aspx,MSVC} -all support the same set -of SSE intrinsics, originally designed by Intel. This -package generally follows the naming scheme of the C -version, with the following exceptions: - -@itemize -@item -Underscores are replaced with dashes, and the @code{_mm_} -prefix is removed in favor of packages. - -@item -The 'e' from @code{epi} is dropped because MMX is obsolete -and won't be supported. - -@item -@code{_si128} functions are renamed to @code{-pi} for uniformity -and brevity. The author has personally found this discrepancy -in the original C intrinsics naming highly jarring. - -@item -Comparisons are named using graphic characters, e.g. @code{<=-ps} -for @code{cmpleps}, or @code{/>-ps} for @code{cmpngtps}. In some -places the set of comparison functions is extended to cover the -full possible range. - -@item -Scalar comparison predicates are named like @code{..-ss?} for -@code{comiss}, and @code{..-ssu?} for @code{ucomiss} wrappers. - -@item -Conversion functions are renamed to @code{convert-*-to-*} and -@code{truncate-*-to-*}. - -@item -A few functions are completely renamed: @code{cpu-mxcsr} (setf-able), -@code{cpu-pause}, @code{cpu-load-fence}, @code{cpu-store-fence}, -@code{cpu-memory-fence}, @code{cpu-clflush}, @code{cpu-prefetch-*}. -@end itemize - -In addition, foreign pointer access intrinsics have an additional -optional integer offset parameter to allow more efficient coding -of pointer deference, and the most common ones have been renamed -and made SETF-able: - -@itemize -@item -@code{mem-ref-ss}, @code{mem-ref-ps}, @code{mem-ref-aps} - -@item -@code{mem-ref-sd}, @code{mem-ref-pd}, @code{mem-ref-apd} - -@item -@code{mem-ref-pi}, @code{mem-ref-api}, @code{mem-ref-si64} -@end itemize - -(The @code{-ap*} version requires alignment.) - -@node Comparisons and NaN handling -@subsection Comparisons and NaN handling - -Floating-point arithmetic intrinsics have trivial IEEE semantics -when given QNaN and SNaN arguments. Comparisons have more complex -behavior, detailed in the following table: - -@multitable { @code{/>=-ss, />=-ps} } { @code{/>=-sd, />=-pd} } { Not greater or equal } { Result for NaN } { QNaN traps } -@item Single-float @tab Double-float @tab Condition @tab Result for NaN @tab QNaN traps -@item @code{=-ss}, @code{=-ps} @tab @code{=-sd}, @code{=-pd} @tab Equal @tab False @tab No -@item @code{<-ss}, @code{<-ps} @tab @code{<-sd}, @code{<-pd} @tab Less @tab False @tab Yes -@item @code{<=-ss}, @code{<=-ps} @tab @code{<=-sd}, @code{<=-pd} @tab Less or equal @tab False @tab Yes -@item @code{>-ss}, @code{>-ps} @tab @code{>-sd}, @code{>-pd} @tab Greater @tab False @tab Yes -@item @code{>=-ss}, @code{>=-ps} @tab @code{>=-sd}, @code{>=-pd} @tab Greater or equal @tab False @tab Yes -@item @code{/=-ss}, @code{/=-ps} @tab @code{/=-sd}, @code{/=-pd} @tab Not equal @tab True @tab No -@item @code{/<-ss}, @code{/<-ps} @tab @code{/<-sd}, @code{/<-pd} @tab Not less @tab True @tab Yes -@item @code{/<=-ss}, @code{/<=-ps} @tab @code{/<=-sd}, @code{/<=-pd} @tab Not less or equal @tab True @tab Yes -@item @code{/>-ss}, @code{/>-ps} @tab @code{/>-sd}, @code{/>-pd} @tab Not greater @tab True @tab Yes -@item @code{/>=-ss}, @code{/>=-ps} @tab @code{/>=-sd}, @code{/>=-pd} @tab Not greater or equal @tab True @tab Yes -@item @code{cmpord-ss}, @code{cmpord-ps} @tab @code{cmpord-sd}, @code{cmpord-pd} -@tab Ordered, i.e. no NaN args @tab False @tab No -@item @code{cmpunord-ss}, @code{cmpunord-ps} @tab @code{cmpunord-sd}, @code{cmpunord-pd} -@tab Unordered, i.e. with NaN args @tab True @tab No -@end multitable - -Likewise for scalar comparison predicates, i.e. functions that return the -result of the comparison as a Lisp boolean instead of a bitmask sse-pack: - -@multitable { Single-float } { Double-float } { Not greater or equal } { Result for NaN } { QNaN traps } -@item Single-float @tab Double-float @tab Condition @tab Result for NaN @tab QNaN traps -@item @code{=-ss?} @tab @code{=-sd?} @tab Equal @tab True @tab Yes -@item @code{=-ssu?} @tab @code{=-sdu?} @tab Equal @tab True @tab No -@item @code{<-ss?} @tab @code{<-sd?} @tab Less @tab True @tab Yes -@item @code{<-ssu?} @tab @code{<-sdu?} @tab Less @tab True @tab No -@item @code{<=-ss?} @tab @code{<=-sd?} @tab Less or equal @tab True @tab Yes -@item @code{<=-ssu?} @tab @code{<=-sdu?} @tab Less or equal @tab True @tab No -@item @code{>-ss?} @tab @code{>-sd?} @tab Greater @tab False @tab Yes -@item @code{>-ssu?} @tab @code{>-sdu?} @tab Greater @tab False @tab No -@item @code{>=-ss?} @tab @code{>=-sd?} @tab Greater or equal @tab False @tab Yes -@item @code{>=-ssu?} @tab @code{>=-sdu?} @tab Greater or equal @tab False @tab No -@item @code{/=-ss?} @tab @code{/=-sd?} @tab Not equal @tab False @tab Yes -@item @code{/=-ssu?} @tab @code{/=-sdu?} @tab Not equal @tab False @tab No -@end multitable - -Note that MSDN specifies different return values for the C counterparts of some -of these functions when called with NaN arguments, but that seems to disagree -with the actually generated code. - -@node Simple extensions -@subsection Simple extensions - -This module extends the set of basic intrinsics with the following -simple compound functions: - -@itemize -@item -@code{neg-ss}, @code{neg-ps}, @code{neg-sd}, @code{neg-pd}, -@code{neg-pi8}, @code{neg-pi16}, @code{neg-pi32}, @code{neg-pi64}: - -implement numeric negation of the corresponding data type. - -@item -@code{not-ps}, @code{not-pd}, @code{not-pi}: - -implement bitwise logical inversion. - -@item -@code{if-ps}, @code{if-pd}, @code{if-pi}: - -perform element-wise combining of two values based on a boolean -condition vector produced as a combination of comparison function -results through bitwise logical functions. - -The condition value must use all-zero bitmask for false, and -all-one bitmask for true as a value for each logical vector -element. The result is undefined if any other bit pattern is used. - -N.B.: these are @emph{functions}, so both branches of the -conditional are always evaluated. -@end itemize - -The module also provides symbol macros that expand into expressions -producing certain constants in the most efficient way: - -@itemize -@item -0.0-ps 0.0-pd 0-pi for zero - -@item -true-ps true-pd true-pi for all 1 bitmask - -@item -false-ps false-pd false-pi for all 0 bitmask (same as zero) -@end itemize - -@node Lisp array accessors -@subsection Lisp array accessors - -In order to provide better integration with ordinary lisp code, -this module implements a set of AREF-like memory accessors: - -@itemize -@item -@code{(ROW-MAJOR-)?AREF-PREFETCH-(T0|T1|T2|NTA)} for cache prefetch. - -@item -@code{(ROW-MAJOR-)?AREF-CLFLUSH} for cache flush. - -@item -@code{(ROW-MAJOR-)?AREF-[AS]?P[SDI]} for whole-pack read & write. - -@item -@code{(ROW-MAJOR-)?AREF-S(S|D|I64)} for scalar read & write. -@end itemize - -(Where A = aligned; S = aligned streamed write.) - -These accessors can be used with any non-bit specialized -array or vector, without restriction on the precise element -type (although it should be declared at compile time to -ensure generation of the fastest code). - -Additional index bound checking is done to ensure that enough -bytes of memory are accessible after the specified index. - -As an exception, ROW-MAJOR-AREF-PREFETCH-* does not do any -range checks at all, because the prefetch instructions -are officially safe to use with bad addresses. The -AREF-PREFETCH-* and *-CLFLUSH functions do only ordinary -index checks without the usual 16-byte extension. - -@node Example -@subsection Example - -This code processes several single-float arrays, storing -either the value of a*b, or c/3.5 into result, depending -on the sign of mode: - -@example -(loop for i from 0 below 128 by 4 - do (setf (aref-ps result i) - (if-ps (<-ps (aref-ps mode i) 0.0-ps) - (mul-ps (aref-ps a i) (aref-ps b i)) - (div-ps (aref-ps c i) (set1-ps 3.5))))) -@end example - -As already noted above, both branches of the if are always -evaluated. From 4c95c75463879c21b1a4c350e5b6edd034bacd87 Mon Sep 17 00:00:00 2001 From: Masataro Asai Date: Wed, 2 Mar 2016 19:10:13 +0900 Subject: [PATCH 2/6] md: misterious quotes --- cl-simd.md | 128 ++++++++++++++++++++++++++--------------------------- 1 file changed, 64 insertions(+), 64 deletions(-) diff --git a/cl-simd.md b/cl-simd.md index 32679ac..af57771 100644 --- a/cl-simd.md +++ b/cl-simd.md @@ -1,15 +1,15 @@ cl-simd ========= -The 'cl-simd' module provides access to SSE2 instructions (which are +The `cl-simd` module provides access to SSE2 instructions (which are nowadays supported by any CPU compatible with x86-64) in the form of _intrinsic functions_, similar to the way adopted by modern C compilers. It also provides some lisp-specific functionality, like setf-able intrinsics for accessing lisp arrays. - When this module is loaded, it defines an ':sse2' feature, which can + When this module is loaded, it defines an `:sse2` feature, which can be subsequently used for conditional compilation of code that depends on -it. Intrinsic functions are available from the 'sse' package. +it. Intrinsic functions are available from the `sse` package. This API, with minor technical differences, is supported by both ECL and SBCL (x86-64 only). @@ -24,13 +24,13 @@ The package defines and/or exports the following types to represent The generic SSE pack type. -- Type: _int-sse-pack,sse_ - Same as '(sse-pack integer)'. + Same as `(sse-pack integer)`. -- Type: _float-sse-pack,sse_ - Same as '(sse-pack single-float)'. + Same as `(sse-pack single-float)`. -- Type: _double-sse-pack,sse_ - Same as '(sse-pack double-float)'. + Same as `(sse-pack double-float)`. Declaring variable types using the subtype appropriate for your data is likely to lead to more efficient code (especially on ECL). However, @@ -38,11 +38,11 @@ the compiler implicitly casts between any subtypes of sse-pack when needed. Printed representation of SSE packs can be controlled by binding -'*sse-pack-print-mode*': +`*sse-pack-print-mode*`: -- Variable: _sse-pack-print-mode,sse_ - When set to one of ':int', ':float' or ':double', specifies the way - SSE packs are printed. A 'NIL' value (default) instructs the + When set to one of `:int`, `:float` or `:double`, specifies the way + SSE packs are printed. A `NIL` value (default) instructs the implementation to make its best effort to guess from the data and context. @@ -52,15 +52,15 @@ SSE array type -- Type: _sse-array,sse_ element-type \&optional dimensions Expands to a lisp array type that is efficiently supported by AREF-like accessors. It should be assumed to be a subtype of - 'SIMPLE-ARRAY'. The type expander signals warnings or errors if it + `SIMPLE-ARRAY`. The type expander signals warnings or errors if it detects that the element-type argument value is inappropriate or unsafe. -- Function: _make-sse-array,sse_ dimensions \&key element-type initial-element displaced-to displaced-index-offset - Creates an object of type 'sse-array', or signals an error. In + Creates an object of type `sse-array`, or signals an error. In non-displaced case ensures alignment of the beginning of data to - the 16-byte boundary. Unlike 'make-array', the element type + the 16-byte boundary. Unlike `make-array`, the element type defaults to (unsigned-byte 8). On ECL this function supports full-featured displacement. On SBCL it @@ -76,42 +76,42 @@ support the same set of SSE intrinsics, originally designed by Intel. This package generally follows the naming scheme of the C version, with the following exceptions: - * Underscores are replaced with dashes, and the '_mm_' prefix is + * Underscores are replaced with dashes, and the `_mm_` prefix is removed in favor of packages. - * The 'e' from 'epi' is dropped because MMX is obsolete and won't be + * The `e` from `epi` is dropped because MMX is obsolete and won`t be supported. - * '_si128' functions are renamed to '-pi' for uniformity and brevity. + * `_si128` functions are renamed to `-pi` for uniformity and brevity. The author has personally found this discrepancy in the original C intrinsics naming highly jarring. - * Comparisons are named using graphic characters, e.g. '<=-ps' for - 'cmpleps', or '/>-ps' for 'cmpngtps'. In some places the set of + * Comparisons are named using graphic characters, e.g. `<=-ps` for + `cmpleps`, or `/>-ps` for `cmpngtps`. In some places the set of comparison functions is extended to cover the full possible range. - * Scalar comparison predicates are named like '..-ss?' for 'comiss', - and '..-ssu?' for 'ucomiss' wrappers. + * Scalar comparison predicates are named like `..-ss?` for `comiss`, + and `..-ssu?` for `ucomiss` wrappers. - * Conversion functions are renamed to 'convert-*-to-*' and - 'truncate-*-to-*'. + * Conversion functions are renamed to `convert-*-to-*` and + `truncate-*-to-*`. - * A few functions are completely renamed: 'cpu-mxcsr' (setf-able), - 'cpu-pause', 'cpu-load-fence', 'cpu-store-fence', - 'cpu-memory-fence', 'cpu-clflush', 'cpu-prefetch-*'. + * A few functions are completely renamed: `cpu-mxcsr` (setf-able), + `cpu-pause`, `cpu-load-fence`, `cpu-store-fence`, + `cpu-memory-fence`, `cpu-clflush`, `cpu-prefetch-*`. In addition, foreign pointer access intrinsics have an additional optional integer offset parameter to allow more efficient coding of pointer deference, and the most common ones have been renamed and made SETF-able: - * 'mem-ref-ss', 'mem-ref-ps', 'mem-ref-aps' + * `mem-ref-ss`, `mem-ref-ps`, `mem-ref-aps` - * 'mem-ref-sd', 'mem-ref-pd', 'mem-ref-apd' + * `mem-ref-sd`, `mem-ref-pd`, `mem-ref-apd` - * 'mem-ref-pi', 'mem-ref-api', 'mem-ref-si64' + * `mem-ref-pi`, `mem-ref-api`, `mem-ref-si64` - (The '-ap*' version requires alignment.) + (The `-ap*` version requires alignment.) Comparisons and NaN handling -------------------------------- @@ -121,40 +121,40 @@ given QNaN and SNaN arguments. Comparisons have more complex behavior, detailed in the following table: Single-float Double-float Condition Result for NaN QNaN traps -'=-ss', '=-ps' '=-sd', '=-pd' Equal False No -'<-ss', '<-ps' '<-sd', '<-pd' Less False Yes -'<=-ss', '<=-ps' '<=-sd', '<=-pd' Less or equal False Yes -'>-ss', '>-ps' '>-sd', '>-pd' Greater False Yes -'>=-ss', '>=-ps' '>=-sd', '>=-pd' Greater or equal False Yes -'/=-ss', '/=-ps' '/=-sd', '/=-pd' Not equal True No -'/<-ss', '/<-ps' '/<-sd', '/<-pd' Not less True Yes -'/<=-ss', '/<=-sd', Not less or equal True Yes -'/<=-ps' '/<=-pd' -'/>-ss', '/>-ps' '/>-sd', '/>-pd' Not greater True Yes -'/>=-ss', '/>=-sd', Not greater or equal True Yes -'/>=-ps' '/>=-pd' -'cmpord-ss', 'cmpord-sd', Ordered, i.e. no NaN False No -'cmpord-ps' 'cmpord-pd' args -'cmpunord-ss', 'cmpunord-sd', Unordered, i.e. with True No -'cmpunord-ps' 'cmpunord-pd' NaN args +`=-ss`, `=-ps` `=-sd`, `=-pd` Equal False No +`<-ss`, `<-ps` `<-sd`, `<-pd` Less False Yes +`<=-ss`, `<=-ps` `<=-sd`, `<=-pd` Less or equal False Yes +`>-ss`, `>-ps` `>-sd`, `>-pd` Greater False Yes +`>=-ss`, `>=-ps` `>=-sd`, `>=-pd` Greater or equal False Yes +`/=-ss`, `/=-ps` `/=-sd`, `/=-pd` Not equal True No +`/<-ss`, `/<-ps` `/<-sd`, `/<-pd` Not less True Yes +`/<=-ss`, `/<=-sd`, Not less or equal True Yes +`/<=-ps` `/<=-pd` +`/>-ss`, `/>-ps` `/>-sd`, `/>-pd` Not greater True Yes +`/>=-ss`, `/>=-sd`, Not greater or equal True Yes +`/>=-ps` `/>=-pd` +`cmpord-ss`, `cmpord-sd`, Ordered, i.e. no NaN False No +`cmpord-ps` `cmpord-pd` args +`cmpunord-ss`, `cmpunord-sd`, Unordered, i.e. with True No +`cmpunord-ps` `cmpunord-pd` NaN args Likewise for scalar comparison predicates, i.e. functions that return the result of the comparison as a Lisp boolean instead of a bitmask sse-pack: Single-float Double-float Condition Result for NaN QNaN traps -'=-ss?' '=-sd?' Equal True Yes -'=-ssu?' '=-sdu?' Equal True No -'<-ss?' '<-sd?' Less True Yes -'<-ssu?' '<-sdu?' Less True No -'<=-ss?' '<=-sd?' Less or equal True Yes -'<=-ssu?' '<=-sdu?' Less or equal True No -'>-ss?' '>-sd?' Greater False Yes -'>-ssu?' '>-sdu?' Greater False No -'>=-ss?' '>=-sd?' Greater or equal False Yes -'>=-ssu?' '>=-sdu?' Greater or equal False No -'/=-ss?' '/=-sd?' Not equal False Yes -'/=-ssu?' '/=-sdu?' Not equal False No +`=-ss?` `=-sd?` Equal True Yes +`=-ssu?` `=-sdu?` Equal True No +`<-ss?` `<-sd?` Less True Yes +`<-ssu?` `<-sdu?` Less True No +`<=-ss?` `<=-sd?` Less or equal True Yes +`<=-ssu?` `<=-sdu?` Less or equal True No +`>-ss?` `>-sd?` Greater False Yes +`>-ssu?` `>-sdu?` Greater False No +`>=-ss?` `>=-sd?` Greater or equal False Yes +`>=-ssu?` `>=-sdu?` Greater or equal False No +`/=-ss?` `/=-sd?` Not equal False Yes +`/=-ssu?` `/=-sdu?` Not equal False No Note that MSDN specifies different return values for the C counterparts of some of these functions when called with NaN arguments, @@ -166,16 +166,16 @@ Simple extensions This module extends the set of basic intrinsics with the following simple compound functions: - * 'neg-ss', 'neg-ps', 'neg-sd', 'neg-pd', 'neg-pi8', 'neg-pi16', - 'neg-pi32', 'neg-pi64': + * `neg-ss`, `neg-ps`, `neg-sd`, `neg-pd`, `neg-pi8`, `neg-pi16`, + `neg-pi32`, `neg-pi64`: implement numeric negation of the corresponding data type. - * 'not-ps', 'not-pd', 'not-pi': + * `not-ps`, `not-pd`, `not-pi`: implement bitwise logical inversion. - * 'if-ps', 'if-pd', 'if-pi': + * `if-ps`, `if-pd`, `if-pi`: perform element-wise combining of two values based on a boolean condition vector produced as a combination of comparison function @@ -203,13 +203,13 @@ Lisp array accessors In order to provide better integration with ordinary lisp code, this module implements a set of AREF-like memory accessors: - * '(ROW-MAJOR-)?AREF-PREFETCH-(T0|T1|T2|NTA)' for cache prefetch. + * `(ROW-MAJOR-)?AREF-PREFETCH-(T0|T1|T2|NTA)` for cache prefetch. - * '(ROW-MAJOR-)?AREF-CLFLUSH' for cache flush. + * `(ROW-MAJOR-)?AREF-CLFLUSH` for cache flush. - * '(ROW-MAJOR-)?AREF-[AS]?P[SDI]' for whole-pack read & write. + * `(ROW-MAJOR-)?AREF-[AS]?P[SDI]` for whole-pack read & write. - * '(ROW-MAJOR-)?AREF-S(S|D|I64)' for scalar read & write. + * `(ROW-MAJOR-)?AREF-S(S|D|I64)` for scalar read & write. (Where A = aligned; S = aligned streamed write.) From 2e23ecfe6ef98139512a219232e6ae50d88a6f6d Mon Sep 17 00:00:00 2001 From: Masataro Asai Date: Wed, 2 Mar 2016 19:15:34 +0900 Subject: [PATCH 3/6] fixed table, added html --- cl-simd.html | 299 +++++++++++++++++++++++++++++++++++++++++++++++++++ cl-simd.md | 63 +++++------ cl-simd.pdf | Bin 0 -> 119213 bytes 3 files changed, 332 insertions(+), 30 deletions(-) create mode 100644 cl-simd.html create mode 100644 cl-simd.pdf diff --git a/cl-simd.html b/cl-simd.html new file mode 100644 index 0000000..799a293 --- /dev/null +++ b/cl-simd.html @@ -0,0 +1,299 @@ +

cl-simd

+

The cl-simd module provides access to SSE2 instructions (which are nowadays supported by any CPU compatible with x86-64) in the form of intrinsic functions, similar to the way adopted by modern C compilers. It also provides some lisp-specific functionality, like setf-able intrinsics for accessing lisp arrays.

+

When this module is loaded, it defines an :sse2 feature, which can be subsequently used for conditional compilation of code that depends on it. Intrinsic functions are available from the sse package.

+

This API, with minor technical differences, is supported by both ECL and SBCL (x86-64 only).

+

SSE pack types

+

The package defines and/or exports the following types to represent 128-bit SSE register contents:

+

-- Type: sse-pack,sse &optional item-type The generic SSE pack type.

+

-- Type: int-sse-pack,sse Same as (sse-pack integer).

+

-- Type: float-sse-pack,sse Same as (sse-pack single-float).

+

-- Type: double-sse-pack,sse Same as (sse-pack double-float).

+

Declaring variable types using the subtype appropriate for your data is likely to lead to more efficient code (especially on ECL). However, the compiler implicitly casts between any subtypes of sse-pack when needed.

+

Printed representation of SSE packs can be controlled by binding *sse-pack-print-mode*:

+

-- Variable: sse-pack-print-mode,sse When set to one of :int, :float or :double, specifies the way SSE packs are printed. A NIL value (default) instructs the implementation to make its best effort to guess from the data and context.

+

SSE array type

+

-- Type: sse-array,sse element-type &optional dimensions Expands to a lisp array type that is efficiently supported by AREF-like accessors. It should be assumed to be a subtype of SIMPLE-ARRAY. The type expander signals warnings or errors if it detects that the element-type argument value is inappropriate or unsafe.

+

-- Function: make-sse-array,sse dimensions &key element-type initial-element displaced-to displaced-index-offset Creates an object of type sse-array, or signals an error. In non-displaced case ensures alignment of the beginning of data to the 16-byte boundary. Unlike make-array, the element type defaults to (unsigned-byte 8).

+

On ECL this function supports full-featured displacement. On SBCL it has to simulate it by sharing the underlying data vector, and does not support nonzero index offset.

+

Differences from C intrinsics

+

Intel Compiler, GCC and MSVC (http://msdn.microsoft.com/en-us/library/y0dh78ez%28VS.80%29.aspx) all support the same set of SSE intrinsics, originally designed by Intel. This package generally follows the naming scheme of the C version, with the following exceptions:

+
    +
  • Underscores are replaced with dashes, and the _mm_ prefix is removed in favor of packages.

  • +
  • The e from epi is dropped because MMX is obsolete and won`t be supported.

  • +
  • _si128 functions are renamed to -pi for uniformity and brevity. The author has personally found this discrepancy in the original C intrinsics naming highly jarring.

  • +
  • Comparisons are named using graphic characters, e.g. <=-ps for cmpleps, or />-ps for cmpngtps. In some places the set of comparison functions is extended to cover the full possible range.

  • +
  • Scalar comparison predicates are named like ..-ss? for comiss, and ..-ssu? for ucomiss wrappers.

  • +
  • Conversion functions are renamed to convert-*-to-* and truncate-*-to-*.

  • +
  • A few functions are completely renamed: cpu-mxcsr (setf-able), cpu-pause, cpu-load-fence, cpu-store-fence, cpu-memory-fence, cpu-clflush, cpu-prefetch-*.

  • +
+

In addition, foreign pointer access intrinsics have an additional optional integer offset parameter to allow more efficient coding of pointer deference, and the most common ones have been renamed and made SETF-able:

+
    +
  • mem-ref-ss, mem-ref-ps, mem-ref-aps

  • +
  • mem-ref-sd, mem-ref-pd, mem-ref-apd

  • +
  • mem-ref-pi, mem-ref-api, mem-ref-si64

  • +
+

(The -ap* version requires alignment.)

+

Comparisons and NaN handling

+

Floating-point arithmetic intrinsics have trivial IEEE semantics when given QNaN and SNaN arguments. Comparisons have more complex behavior, detailed in the following table:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Single-floatDouble-floatConditionResult for NaNQNaN traps
=-ss,=-ps=-sd,=-pdEqualFalseNo
<-ss,<-ps<-sd,<-pdLessFalseYes
<=-ss,<=-ps<=-sd,<=-pdLess or equalFalseYes
>-ss,>-ps>-sd,>-pdGreaterFalseYes
>=-ss,>=-ps>=-sd,>=-pdGreater or equalFalseYes
/=-ss,/=-ps/=-sd,/=-pdNot equalTrueNo
/<-ss,/<-ps/<-sd,/<-pdNot lessTrueYes
/<=-ss,/<=-sd,Not less or equalTrueYes
/<=-ps/<=-pd
/>-ss,/>-ps/>-sd,/>-pdNot greaterTrueYes
/>=-ss,/>=-sd,Not greater or equalTrueYes
/>=-ps/>=-pd
cmpord-ss,cmpord-sd,Ordered, i.e. no NaN argsFalseNo
cmpord-pscmpord-pd
cmpunord-ss,cmpunord-sd,Unordered, i.e. with NaN argsTrueNo
cmpunord-pscmpunord-pd
+

Likewise for scalar comparison predicates, i.e. functions that return the result of the comparison as a Lisp boolean instead of a bitmask sse-pack:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Single-floatDouble-floatConditionResult_for_NaNQNaN_traps
=-ss?=-sd?EqualTrueYes
=-ssu?=-sdu?EqualTrueNo
<-ss?<-sd?LessTrueYes
<-ssu?<-sdu?LessTrueNo
<=-ss?<=-sd?Less_or_equalTrueYes
<=-ssu?<=-sdu?Less_or_equalTrueNo
>-ss?>-sd?GreaterFalseYes
>-ssu?>-sdu?GreaterFalseNo
>=-ss?>=-sd?Greater_or_equalFalseYes
>=-ssu?>=-sdu?Greater_or_equalFalseNo
/=-ss?/=-sd?Not_equalFalseYes
/=-ssu?/=-sdu?Not_equalFalseNo
+

Note that MSDN specifies different return values for the C counterparts of some of these functions when called with NaN arguments, but that seems to disagree with the actually generated code.

+

Simple extensions

+

This module extends the set of basic intrinsics with the following simple compound functions:

+
    +
  • neg-ss, neg-ps, neg-sd, neg-pd, neg-pi8, neg-pi16, neg-pi32, neg-pi64:

    +

    implement numeric negation of the corresponding data type.

  • +
  • not-ps, not-pd, not-pi:

    +

    implement bitwise logical inversion.

  • +
  • if-ps, if-pd, if-pi:

    +

    perform element-wise combining of two values based on a boolean condition vector produced as a combination of comparison function results through bitwise logical functions.

    +

    The condition value must use all-zero bitmask for false, and all-one bitmask for true as a value for each logical vector element. The result is undefined if any other bit pattern is used.

    +

    N.B.: these are functions, so both branches of the conditional are always evaluated.

  • +
+

The module also provides symbol macros that expand into expressions producing certain constants in the most efficient way:

+
    +
  • 0.0-ps 0.0-pd 0-pi for zero

  • +
  • true-ps true-pd true-pi for all 1 bitmask

  • +
  • false-ps false-pd false-pi for all 0 bitmask (same as zero)

  • +
+

Lisp array accessors

+

In order to provide better integration with ordinary lisp code, this module implements a set of AREF-like memory accessors:

+
    +
  • (ROW-MAJOR-)?AREF-PREFETCH-(T0|T1|T2|NTA) for cache prefetch.

  • +
  • (ROW-MAJOR-)?AREF-CLFLUSH for cache flush.

  • +
  • (ROW-MAJOR-)?AREF-[AS]?P[SDI] for whole-pack read & write.

  • +
  • (ROW-MAJOR-)?AREF-S(S|D|I64) for scalar read & write.

  • +
+

(Where A = aligned; S = aligned streamed write.)

+

These accessors can be used with any non-bit specialized array or vector, without restriction on the precise element type (although it should be declared at compile time to ensure generation of the fastest code).

+

Additional index bound checking is done to ensure that enough bytes of memory are accessible after the specified index.

+

As an exception, ROW-MAJOR-AREF-PREFETCH-* does not do any range checks at all, because the prefetch instructions are officially safe to use with bad addresses. The AREF-PREFETCH-* and *-CLFLUSH functions do only ordinary index checks without the usual 16-byte extension.

+

Example

+

This code processes several single-float arrays, storing either the value of a*b, or c/3.5 into result, depending on the sign of mode:

+
 (loop for i from 0 below 128 by 4
+    do (setf (aref-ps result i)
+             (if-ps (<-ps (aref-ps mode i) 0.0-ps)
+                    (mul-ps (aref-ps a i) (aref-ps b i))
+                    (div-ps (aref-ps c i) (set1-ps 3.5)))))
+

As already noted above, both branches of the if are always evaluated.

diff --git a/cl-simd.md b/cl-simd.md index af57771..5387e88 100644 --- a/cl-simd.md +++ b/cl-simd.md @@ -120,41 +120,44 @@ Floating-point arithmetic intrinsics have trivial IEEE semantics when given QNaN and SNaN arguments. Comparisons have more complex behavior, detailed in the following table: -Single-float Double-float Condition Result for NaN QNaN traps -`=-ss`, `=-ps` `=-sd`, `=-pd` Equal False No -`<-ss`, `<-ps` `<-sd`, `<-pd` Less False Yes -`<=-ss`, `<=-ps` `<=-sd`, `<=-pd` Less or equal False Yes -`>-ss`, `>-ps` `>-sd`, `>-pd` Greater False Yes -`>=-ss`, `>=-ps` `>=-sd`, `>=-pd` Greater or equal False Yes -`/=-ss`, `/=-ps` `/=-sd`, `/=-pd` Not equal True No -`/<-ss`, `/<-ps` `/<-sd`, `/<-pd` Not less True Yes -`/<=-ss`, `/<=-sd`, Not less or equal True Yes -`/<=-ps` `/<=-pd` -`/>-ss`, `/>-ps` `/>-sd`, `/>-pd` Not greater True Yes -`/>=-ss`, `/>=-sd`, Not greater or equal True Yes -`/>=-ps` `/>=-pd` -`cmpord-ss`, `cmpord-sd`, Ordered, i.e. no NaN False No -`cmpord-ps` `cmpord-pd` args -`cmpunord-ss`, `cmpunord-sd`, Unordered, i.e. with True No -`cmpunord-ps` `cmpunord-pd` NaN args +| Single-float | Double-float | Condition | Result for NaN | QNaN traps | +|-----------------+-----------------+--------------------------------+----------------+------------| +| `=-ss`,`=-ps` | `=-sd`,`=-pd` | Equal | False | No | +| `<-ss`,`<-ps` | `<-sd`,`<-pd` | Less | False | Yes | +| `<=-ss`,`<=-ps` | `<=-sd`,`<=-pd` | Less or equal | False | Yes | +| `>-ss`,`>-ps` | `>-sd`,`>-pd` | Greater | False | Yes | +| `>=-ss`,`>=-ps` | `>=-sd`,`>=-pd` | Greater or equal | False | Yes | +| `/=-ss`,`/=-ps` | `/=-sd`,`/=-pd` | Not equal | True | No | +| `/<-ss`,`/<-ps` | `/<-sd`,`/<-pd` | Not less | True | Yes | +| `/<=-ss`, | `/<=-sd`, | Not less or equal | True | Yes | +| `/<=-ps` | `/<=-pd` | | | | +| `/>-ss`,`/>-ps` | `/>-sd`,`/>-pd` | Not greater | True | Yes | +| `/>=-ss`, | `/>=-sd`, | Not greater or equal | True | Yes | +| `/>=-ps` | `/>=-pd` | | | | +| `cmpord-ss`, | `cmpord-sd`, | Ordered, i.e. no NaN args | False | No | +| `cmpord-ps` | `cmpord-pd` | | | | +| `cmpunord-ss`, | `cmpunord-sd`, | Unordered, i.e. with NaN args | True | No | +| `cmpunord-ps` | `cmpunord-pd` | | | | + Likewise for scalar comparison predicates, i.e. functions that return the result of the comparison as a Lisp boolean instead of a bitmask sse-pack: -Single-float Double-float Condition Result for NaN QNaN traps -`=-ss?` `=-sd?` Equal True Yes -`=-ssu?` `=-sdu?` Equal True No -`<-ss?` `<-sd?` Less True Yes -`<-ssu?` `<-sdu?` Less True No -`<=-ss?` `<=-sd?` Less or equal True Yes -`<=-ssu?` `<=-sdu?` Less or equal True No -`>-ss?` `>-sd?` Greater False Yes -`>-ssu?` `>-sdu?` Greater False No -`>=-ss?` `>=-sd?` Greater or equal False Yes -`>=-ssu?` `>=-sdu?` Greater or equal False No -`/=-ss?` `/=-sd?` Not equal False Yes -`/=-ssu?` `/=-sdu?` Not equal False No +| Single-float | Double-float | Condition | Result_for_NaN | QNaN_traps | +|--------------+--------------+------------------+----------------+------------| +| `=-ss?` | `=-sd?` | Equal | True | Yes | +| `=-ssu?` | `=-sdu?` | Equal | True | No | +| `<-ss?` | `<-sd?` | Less | True | Yes | +| `<-ssu?` | `<-sdu?` | Less | True | No | +| `<=-ss?` | `<=-sd?` | Less_or_equal | True | Yes | +| `<=-ssu?` | `<=-sdu?` | Less_or_equal | True | No | +| `>-ss?` | `>-sd?` | Greater | False | Yes | +| `>-ssu?` | `>-sdu?` | Greater | False | No | +| `>=-ss?` | `>=-sd?` | Greater_or_equal | False | Yes | +| `>=-ssu?` | `>=-sdu?` | Greater_or_equal | False | No | +| `/=-ss?` | `/=-sd?` | Not_equal | False | Yes | +| `/=-ssu?` | `/=-sdu?` | Not_equal | False | No | Note that MSDN specifies different return values for the C counterparts of some of these functions when called with NaN arguments, diff --git a/cl-simd.pdf b/cl-simd.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f4c16d68b0203be0821be40268f20c44b15ca047 GIT binary patch literal 119213 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%0A+5W-MQJ?R=0(R-t`sJuUUBIm-AEeE(eCV1Szy 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 Date: Wed, 2 Mar 2016 19:24:02 +0900 Subject: [PATCH 4/6] makefile --- .gitignore | 2 ++ Makefile | 7 +++++++ 2 files changed, 9 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f2308d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*~ +#* diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9cd0a9a --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ + + +all: cl-simd.html cl-simd.pdf +%.html: %.md + pandoc $< -o $@ +%.pdf: %.md + pandoc $< -o $@ From 2ff24fd216d4b6cb13bc6d43ce68a681a21ea4ac Mon Sep 17 00:00:00 2001 From: Masataro Asai Date: Wed, 2 Mar 2016 19:39:21 +0900 Subject: [PATCH 5/6] mod (footnotes, etc.) --- Makefile | 9 ++++---- cl-simd.html | 64 +++++++++++++++++++++++++++++++++++++-------------- cl-simd.md | 47 ++++++++++++++++++++----------------- cl-simd.pdf | Bin 119213 -> 217088 bytes 4 files changed, 78 insertions(+), 42 deletions(-) diff --git a/Makefile b/Makefile index 9cd0a9a..1444075 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,8 @@ +FROM = markdown_phpextra+backtick_code_blocks+footnotes all: cl-simd.html cl-simd.pdf -%.html: %.md - pandoc $< -o $@ -%.pdf: %.md - pandoc $< -o $@ +%.html: %.md Makefile + pandoc -f $(FROM) $< -o $@ +%.pdf: %.md Makefile + pandoc -f $(FROM) $< -o $@ diff --git a/cl-simd.html b/cl-simd.html index 799a293..e569ae7 100644 --- a/cl-simd.html +++ b/cl-simd.html @@ -1,22 +1,46 @@ -

cl-simd

+

cl-simd

The cl-simd module provides access to SSE2 instructions (which are nowadays supported by any CPU compatible with x86-64) in the form of intrinsic functions, similar to the way adopted by modern C compilers. It also provides some lisp-specific functionality, like setf-able intrinsics for accessing lisp arrays.

When this module is loaded, it defines an :sse2 feature, which can be subsequently used for conditional compilation of code that depends on it. Intrinsic functions are available from the sse package.

This API, with minor technical differences, is supported by both ECL and SBCL (x86-64 only).

-

SSE pack types

+

SSE pack types

The package defines and/or exports the following types to represent 128-bit SSE register contents:

-

-- Type: sse-pack,sse &optional item-type The generic SSE pack type.

-

-- Type: int-sse-pack,sse Same as (sse-pack integer).

-

-- Type: float-sse-pack,sse Same as (sse-pack single-float).

-

-- Type: double-sse-pack,sse Same as (sse-pack double-float).

+
+
Package: sse
+

The packages where the cl-simd symbols are present.

+
+
Type: sse-pack &optional item-type
+

The generic SSE pack type.

+
+
Type: int-sse-pack
+

Same as (sse-pack integer).

+
+
Type: float-sse-pack
+

Same as (sse-pack single-float).

+
+
Type: double-sse-pack
+

Same as (sse-pack double-float).

+
+

Declaring variable types using the subtype appropriate for your data is likely to lead to more efficient code (especially on ECL). However, the compiler implicitly casts between any subtypes of sse-pack when needed.

Printed representation of SSE packs can be controlled by binding *sse-pack-print-mode*:

-

-- Variable: sse-pack-print-mode,sse When set to one of :int, :float or :double, specifies the way SSE packs are printed. A NIL value (default) instructs the implementation to make its best effort to guess from the data and context.

-

SSE array type

-

-- Type: sse-array,sse element-type &optional dimensions Expands to a lisp array type that is efficiently supported by AREF-like accessors. It should be assumed to be a subtype of SIMPLE-ARRAY. The type expander signals warnings or errors if it detects that the element-type argument value is inappropriate or unsafe.

-

-- Function: make-sse-array,sse dimensions &key element-type initial-element displaced-to displaced-index-offset Creates an object of type sse-array, or signals an error. In non-displaced case ensures alignment of the beginning of data to the 16-byte boundary. Unlike make-array, the element type defaults to (unsigned-byte 8).

-

On ECL this function supports full-featured displacement. On SBCL it has to simulate it by sharing the underlying data vector, and does not support nonzero index offset.

-

Differences from C intrinsics

-

Intel Compiler, GCC and MSVC (http://msdn.microsoft.com/en-us/library/y0dh78ez%28VS.80%29.aspx) all support the same set of SSE intrinsics, originally designed by Intel. This package generally follows the naming scheme of the C version, with the following exceptions:

+
+
Variable: sse-pack-print-mode
+
When set to one of :int, :float or :double, specifies the way SSE packs are printed. A NIL value (default) instructs the implementation to make its best effort to guess from the data and context. +
+
+

SSE array type

+
+
Type: sse-array element-type &optional dimensions
+

Expands to a lisp array type that is efficiently supported by AREF-like accessors. It should be assumed to be a subtype of SIMPLE-ARRAY. The type expander signals warnings or errors if it detects that the element-type argument value is inappropriate or unsafe.

+
+
Function: make-sse-array dimensions &key element-type initial-element displaced-to displaced-index-offset
+

Creates an object of type sse-array, or signals an error. In non-displaced case ensures alignment of the beginning of data to the 16-byte boundary. Unlike make-array, the element type defaults to (unsigned-byte 8).

+
+

On ECL this function supports full-featured displacement. On SBCL it has to simulate it by sharing the underlying data vector, and does not support nonzero index offset.

+
+
+

Differences from C intrinsics

+

Intel Compiler, GCC and MSVC1 all support the same set of SSE intrinsics, originally designed by Intel. This package generally follows the naming scheme of the C version, with the following exceptions:

  • Underscores are replaced with dashes, and the _mm_ prefix is removed in favor of packages.

  • The e from epi is dropped because MMX is obsolete and won`t be supported.

  • @@ -33,7 +57,7 @@

    Differences from C intrinsics

  • mem-ref-pi, mem-ref-api, mem-ref-si64

(The -ap* version requires alignment.)

-

Comparisons and NaN handling

+

Comparisons and NaN handling

Floating-point arithmetic intrinsics have trivial IEEE semantics when given QNaN and SNaN arguments. Comparisons have more complex behavior, detailed in the following table:

@@ -259,7 +283,7 @@

Comparisons and NaN handling

Note that MSDN specifies different return values for the C counterparts of some of these functions when called with NaN arguments, but that seems to disagree with the actually generated code.

-

Simple extensions

+

Simple extensions

This module extends the set of basic intrinsics with the following simple compound functions:

  • neg-ss, neg-ps, neg-sd, neg-pd, neg-pi8, neg-pi16, neg-pi32, neg-pi64:

    @@ -277,7 +301,7 @@

    Simple extensions

  • true-ps true-pd true-pi for all 1 bitmask

  • false-ps false-pd false-pi for all 0 bitmask (same as zero)

-

Lisp array accessors

+

Lisp array accessors

In order to provide better integration with ordinary lisp code, this module implements a set of AREF-like memory accessors: