create special intrinsic wrappers for 256-vector>scalar operations so that vall?, vany?, vnone? work on 256-vectors
parent
72986dc66d
commit
952498ef69
|
@ -5,7 +5,8 @@ functors generalizations kernel literals locals math math.functions
|
||||||
math.vectors math.vectors.private math.vectors.simd.intrinsics
|
math.vectors math.vectors.private math.vectors.simd.intrinsics
|
||||||
math.vectors.specialization parser prettyprint.custom sequences
|
math.vectors.specialization parser prettyprint.custom sequences
|
||||||
sequences.private strings words definitions macros cpu.architecture
|
sequences.private strings words definitions macros cpu.architecture
|
||||||
namespaces arrays quotations combinators sets layouts ;
|
namespaces arrays quotations combinators combinators.short-circuit sets
|
||||||
|
layouts ;
|
||||||
QUALIFIED-WITH: alien.c-types c
|
QUALIFIED-WITH: alien.c-types c
|
||||||
IN: math.vectors.simd.functor
|
IN: math.vectors.simd.functor
|
||||||
|
|
||||||
|
@ -95,14 +96,17 @@ MACRO: simd-nth ( rep -- x )
|
||||||
'[ nip _ swap supported-simd-op? ] assoc-filter
|
'[ nip _ swap supported-simd-op? ] assoc-filter
|
||||||
'[ drop _ key? ] assoc-filter ;
|
'[ drop _ key? ] assoc-filter ;
|
||||||
|
|
||||||
ERROR: bad-schema schema ;
|
ERROR: bad-schema op schema ;
|
||||||
|
|
||||||
: low-level-ops ( simd-ops alist -- alist' )
|
:: op-wrapper ( op specials schemas -- wrapper )
|
||||||
'[
|
op {
|
||||||
1quotation
|
[ specials at ]
|
||||||
over word-schema _ ?at [ bad-schema ] unless
|
[ word-schema schemas at ]
|
||||||
[ ] 2sequence
|
[ dup word-schema bad-schema ]
|
||||||
] assoc-map ;
|
} 1|| ;
|
||||||
|
|
||||||
|
: low-level-ops ( simd-ops specials schemas -- alist )
|
||||||
|
'[ 1quotation over _ _ op-wrapper [ ] 2sequence ] assoc-map ;
|
||||||
|
|
||||||
:: high-level-ops ( ctor elt-class -- assoc )
|
:: high-level-ops ( ctor elt-class -- assoc )
|
||||||
! Some SIMD operations are defined in terms of others.
|
! Some SIMD operations are defined in terms of others.
|
||||||
|
@ -126,14 +130,14 @@ ERROR: bad-schema schema ;
|
||||||
! in the general case.
|
! in the general case.
|
||||||
elt-class float = [ { distance [ v- norm ] } suffix ] when ;
|
elt-class float = [ { distance [ v- norm ] } suffix ] when ;
|
||||||
|
|
||||||
TUPLE: simd class elt-class ops wrappers ctor rep ;
|
TUPLE: simd class elt-class ops special-wrappers schema-wrappers ctor rep ;
|
||||||
|
|
||||||
: define-simd ( simd -- )
|
: define-simd ( simd -- )
|
||||||
dup rep>> rep-component-type c:c-type-boxed-class >>elt-class
|
dup rep>> rep-component-type c:c-type-boxed-class >>elt-class
|
||||||
{
|
{
|
||||||
[ class>> ]
|
[ class>> ]
|
||||||
[ elt-class>> ]
|
[ elt-class>> ]
|
||||||
[ [ ops>> ] [ wrappers>> ] bi low-level-ops ]
|
[ [ ops>> ] [ special-wrappers>> ] [ schema-wrappers>> ] tri low-level-ops ]
|
||||||
[ rep>> supported-simd-ops ]
|
[ rep>> supported-simd-ops ]
|
||||||
[ [ ctor>> ] [ elt-class>> ] bi high-level-ops assoc-union ]
|
[ [ ctor>> ] [ elt-class>> ] bi high-level-ops assoc-union ]
|
||||||
} cleave
|
} cleave
|
||||||
|
@ -262,7 +266,7 @@ simd new
|
||||||
{ { +vector+ -> +vector+ } A-v->v-op }
|
{ { +vector+ -> +vector+ } A-v->v-op }
|
||||||
{ { +vector+ -> +scalar+ } A-v->n-op }
|
{ { +vector+ -> +scalar+ } A-v->n-op }
|
||||||
{ { +vector+ -> +nonnegative+ } A-v->n-op }
|
{ { +vector+ -> +nonnegative+ } A-v->n-op }
|
||||||
} >>wrappers
|
} >>schema-wrappers
|
||||||
(define-simd-128)
|
(define-simd-128)
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
@ -318,9 +322,12 @@ A-deref DEFINES-PRIVATE ${A}-deref
|
||||||
A-rep [ A/2 name>> "-rep" append "cpu.architecture" lookup ]
|
A-rep [ A/2 name>> "-rep" append "cpu.architecture" lookup ]
|
||||||
A-vv->v-op DEFINES-PRIVATE ${A}-vv->v-op
|
A-vv->v-op DEFINES-PRIVATE ${A}-vv->v-op
|
||||||
A-vn->v-op DEFINES-PRIVATE ${A}-vn->v-op
|
A-vn->v-op DEFINES-PRIVATE ${A}-vn->v-op
|
||||||
A-vv->n-op DEFINES-PRIVATE ${A}-vv->n-op
|
|
||||||
A-v->v-op DEFINES-PRIVATE ${A}-v->v-op
|
A-v->v-op DEFINES-PRIVATE ${A}-v->v-op
|
||||||
A-v->n-op DEFINES-PRIVATE ${A}-v->n-op
|
A-v.-op DEFINES-PRIVATE ${A}-v.-op
|
||||||
|
(A-v->n-op) DEFINES-PRIVATE (${A}-v->v-op)
|
||||||
|
A-sum-op DEFINES-PRIVATE ${A}-sum-op
|
||||||
|
A-vany-op DEFINES-PRIVATE ${A}-vany-op
|
||||||
|
A-vall-op DEFINES-PRIVATE ${A}-vall-op
|
||||||
|
|
||||||
WHERE
|
WHERE
|
||||||
|
|
||||||
|
@ -393,32 +400,44 @@ INSTANCE: A sequence
|
||||||
[ [ [ underlying2>> ] dip A-rep ] dip call ] 3bi
|
[ [ [ underlying2>> ] dip A-rep ] dip call ] 3bi
|
||||||
\ A boa ; inline
|
\ A boa ; inline
|
||||||
|
|
||||||
: A-vv->n-op ( v1 v2 quot -- v3 )
|
|
||||||
[ [ [ underlying1>> ] bi@ A-rep ] dip call ]
|
|
||||||
[ [ [ underlying2>> ] bi@ A-rep ] dip call ] 3bi
|
|
||||||
+ ; inline
|
|
||||||
|
|
||||||
: A-v->v-op ( v1 combine-quot -- v2 )
|
: A-v->v-op ( v1 combine-quot -- v2 )
|
||||||
[ [ underlying1>> A-rep ] dip call ]
|
[ [ underlying1>> A-rep ] dip call ]
|
||||||
[ [ underlying2>> A-rep ] dip call ] 2bi
|
[ [ underlying2>> A-rep ] dip call ] 2bi
|
||||||
\ A boa ; inline
|
\ A boa ; inline
|
||||||
|
|
||||||
: A-v->n-op ( v1 combine-quot -- v2 )
|
: A-v.-op ( v1 v2 quot -- n )
|
||||||
[ [ underlying1>> ] [ underlying2>> ] bi A-rep (simd-v+) A-rep ] dip call ; inline
|
[ [ [ underlying1>> ] bi@ A-rep ] dip call ]
|
||||||
|
[ [ [ underlying2>> ] bi@ A-rep ] dip call ] 3bi
|
||||||
|
+ ; inline
|
||||||
|
|
||||||
|
: (A-v->n-op) ( v1 quot reduce-quot -- n )
|
||||||
|
'[ [ underlying1>> ] [ underlying2>> ] bi A-rep @ A-rep ] dip call ; inline
|
||||||
|
|
||||||
|
: A-sum-op ( v1 quot -- n )
|
||||||
|
[ (simd-v+) ] (A-v->n-op) ; inline
|
||||||
|
|
||||||
|
: A-vany-op ( v1 quot -- n )
|
||||||
|
[ (simd-vbitor) ] (A-v->n-op) ; inline
|
||||||
|
: A-vall-op ( v1 quot -- n )
|
||||||
|
[ (simd-vbitand) ] (A-v->n-op) ; inline
|
||||||
|
|
||||||
simd new
|
simd new
|
||||||
\ A >>class
|
\ A >>class
|
||||||
\ A-with >>ctor
|
\ A-with >>ctor
|
||||||
\ A-rep >>rep
|
\ A-rep >>rep
|
||||||
|
{
|
||||||
|
{ v. A-v.-op }
|
||||||
|
{ sum A-sum-op }
|
||||||
|
{ vnone? A-vany-op }
|
||||||
|
{ vany? A-vany-op }
|
||||||
|
{ vall? A-vall-op }
|
||||||
|
} >>special-wrappers
|
||||||
{
|
{
|
||||||
{ { +vector+ +vector+ -> +vector+ } A-vv->v-op }
|
{ { +vector+ +vector+ -> +vector+ } A-vv->v-op }
|
||||||
{ { +vector+ +scalar+ -> +vector+ } A-vn->v-op }
|
{ { +vector+ +scalar+ -> +vector+ } A-vn->v-op }
|
||||||
{ { +vector+ +literal+ -> +vector+ } A-vn->v-op }
|
{ { +vector+ +literal+ -> +vector+ } A-vn->v-op }
|
||||||
{ { +vector+ +vector+ -> +scalar+ } A-vv->n-op }
|
|
||||||
{ { +vector+ -> +vector+ } A-v->v-op }
|
{ { +vector+ -> +vector+ } A-v->v-op }
|
||||||
{ { +vector+ -> +scalar+ } A-v->n-op }
|
} >>schema-wrappers
|
||||||
{ { +vector+ -> +nonnegative+ } A-v->n-op }
|
|
||||||
} >>wrappers
|
|
||||||
(define-simd-256)
|
(define-simd-256)
|
||||||
|
|
||||||
;FUNCTOR
|
;FUNCTOR
|
||||||
|
|
Loading…
Reference in New Issue