WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit 4fb8747

Browse files
authored
make gather / scatter operations work on Vector{Bool} (#153)
1 parent 7ae21e8 commit 4fb8747

File tree

3 files changed

+61
-7
lines changed

3 files changed

+61
-7
lines changed

src/SIMD.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ const IntegerTypes = Union{IntTypes, UIntTypes}
1818
const BIntegerTypes = Union{IntegerTypes, Bool}
1919
const FloatingTypes = Union{Float16, Float32, Float64}
2020
const ScalarTypes = Union{IntegerTypes, FloatingTypes}
21-
const VecTypes = Union{ScalarTypes, Ptr, LLVMPtr, Bool}
21+
const BScalarTypes = Union{BIntegerTypes, FloatingTypes}
22+
const VecTypes = Union{BScalarTypes, Ptr, LLVMPtr}
2223
include("LLVM_intrinsics.jl")
2324
include("simdvec.jl")
2425
include("arrayops.jl")

src/arrayops.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -151,13 +151,13 @@ end
151151
# therefore use @propagate_inbounds
152152
@inline vgather(ptrs::Vec{N,<:AnyPtr{T}},
153153
mask::Vec{N,Bool}=one(Vec{N,Bool}),
154-
::Val{Aligned}=Val(false)) where {N, T<:ScalarTypes, Aligned} =
154+
::Val{Aligned}=Val(false)) where {N, T<:BScalarTypes, Aligned} =
155155
return Vec(Intrinsics.maskedgather(ptrs.data, mask.data))
156-
@inline vgather(ptrs::Vec{<:Any,<:AnyPtr{<:ScalarTypes}}, ::Nothing, aligned::Val = Val(false)) =
156+
@inline vgather(ptrs::Vec{<:Any,<:AnyPtr{<:BScalarTypes}}, ::Nothing, aligned::Val = Val(false)) =
157157
vgather(ptrs, one(Vec{length(ptrs),Bool}), aligned)
158158
@propagate_inbounds function vgather(a::FastContiguousArray{T,1}, idx::Vec{N, <:Integer},
159159
mask::Vec{N,Bool}=one(Vec{N,Bool}),
160-
::Val{Aligned}=Val(false)) where {N, T<:ScalarTypes, Aligned}
160+
::Val{Aligned}=Val(false)) where {N, T<:BScalarTypes, Aligned}
161161
@boundscheck for i in 1:N
162162
checkbounds(a, @inbounds idx[i])
163163
end
@@ -176,14 +176,14 @@ end
176176

177177

178178
@propagate_inbounds vscatter(x::Vec{N,T}, ptrs::Vec{N,<:AnyPtr{T}},
179-
mask::Vec{N,Bool}, ::Val{Aligned}=Val(false)) where {N, T<:ScalarTypes, Aligned} =
179+
mask::Vec{N,Bool}, ::Val{Aligned}=Val(false)) where {N, T<:BScalarTypes, Aligned} =
180180
Intrinsics.maskedscatter(x.data, ptrs.data, mask.data)
181181
@inline vscatter(x::Vec{N,T}, ptrs::Vec{N,<:AnyPtr{T}},
182-
::Nothing, aligned::Val=Val(false)) where {N, T<:ScalarTypes} =
182+
::Nothing, aligned::Val=Val(false)) where {N, T<:BScalarTypes} =
183183
vscatter(x, ptrs, one(Vec{N, Bool}), aligned)
184184
@propagate_inbounds function vscatter(x::Vec{N,T}, a::FastContiguousArray{T,1}, idx::Vec{N, <:Integer},
185185
mask::Vec{N,Bool}=one(Vec{N, Bool}),
186-
::Val{Aligned}=Val(false)) where {N, T<:ScalarTypes, Aligned}
186+
::Val{Aligned}=Val(false)) where {N, T<:BScalarTypes, Aligned}
187187
@boundscheck for i in 1:N
188188
checkbounds(a, @inbounds idx[i])
189189
end

test/runtests.jl

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,7 @@ llvm_ir(f, args) = sprint(code_llvm, f, Base.typesof(args...))
419419
end
420420

421421
global const arrf64 = valloc(Float64, L4, 4*L4) do i i end
422+
global const arrbool = valloc(Bool, L8, 2*L8) do i isodd(i) end
422423
for i in 1:length(arrf64)-(L4-1)
423424
@test vload(V4F64, arrf64, i) === V4F64(ntuple(j->i+j-1, L4))
424425
end
@@ -593,6 +594,58 @@ llvm_ir(f, args) = sprint(code_llvm, f, Base.typesof(args...))
593594
end
594595
end
595596
end
597+
598+
# Test Bool gather/scatter operations (issue #150)
599+
@testset "Bool gather and scatter" begin
600+
V8BOOL = Vec{L8,Bool}
601+
arrbool .= [isodd(i) for i in 1:length(arrbool)]
602+
idxarr = floor.(Int, range(1, stop=length(arrbool), length=L8))
603+
604+
idx = Vec(Tuple(idxarr))
605+
expected_vals = [arrbool[i] for i in idxarr]
606+
expected_vec = V8BOOL(Tuple(expected_vals))
607+
608+
@test vgather(arrbool, idx) === expected_vec
609+
@test vgathera(arrbool, idx) === expected_vec
610+
@test arrbool[idx] === expected_vec
611+
612+
# Masked gather for Bool
613+
maskarr = zeros(Bool, L8)
614+
for i in 1:L8
615+
maskarr[i] = true
616+
mask = Vec(Tuple(maskarr))
617+
expected_masked = V8BOOL(Tuple(expected_vals .* maskarr))
618+
@test vgather(arrbool, idx, mask) === expected_masked
619+
@test vgathera(arrbool, idx, mask) === expected_masked
620+
@test arrbool[idx, mask] === expected_masked
621+
end
622+
623+
# Scatter for Bool
624+
varr = [isodd(i*3) for i in 1:L8] # Different pattern for scatter
625+
v = Vec(Tuple(varr))
626+
627+
vscatter(v, fill!(arrbool, false), idx)
628+
@test [arrbool[i] for i in idxarr] == varr
629+
vscattera(v, fill!(arrbool, false), idx)
630+
@test [arrbool[i] for i in idxarr] == varr
631+
fill!(arrbool, false)
632+
arrbool[idx] = v
633+
@test [arrbool[i] for i in idxarr] == varr
634+
635+
# Masked scatter for Bool
636+
maskarr = zeros(Bool, L8)
637+
for i in 1:L8
638+
maskarr[i] = true
639+
mask = Vec(Tuple(maskarr))
640+
vscatter(v, fill!(arrbool, false), idx, mask)
641+
@test [arrbool[i] for i in idxarr] == varr .* maskarr
642+
vscattera(v, fill!(arrbool, false), idx, mask)
643+
@test [arrbool[i] for i in idxarr] == varr .* maskarr
644+
fill!(arrbool, false)
645+
arrbool[idx, mask] = v
646+
@test [arrbool[i] for i in idxarr] == varr .* maskarr
647+
end
648+
end
596649
end
597650

598651
@testset "expandload" begin

0 commit comments

Comments
 (0)