Skip to content

Commit 9ddbd56

Browse files
Simd random mask benchmark (#36579)
* Add benchmark for SIMDMask.random generation. * Add bitcast for IntN -> VecNxInt1
1 parent a72070e commit 9ddbd56

File tree

5 files changed

+109
-0
lines changed

5 files changed

+109
-0
lines changed

benchmark/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ set(SWIFT_BENCH_MODULES
158158
single-source/RemoveWhere
159159
single-source/ReversedCollections
160160
single-source/RomanNumbers
161+
single-source/SIMDRandomMask
161162
single-source/SIMDReduceInteger
162163
single-source/SequenceAlgos
163164
single-source/SetTests
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
//===--- SIMDRandomMask.swift ---------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2021 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
import TestsUtils
14+
15+
public let SIMDRandomMask = [
16+
BenchmarkInfo(
17+
name: "SIMDRandomMask.Int8x16",
18+
runFunction: run_SIMDRandomMaskInt8x16,
19+
tags: [.validation, .SIMD]
20+
),
21+
BenchmarkInfo(
22+
name: "SIMDRandomMask.Int8x64",
23+
runFunction: run_SIMDRandomMaskInt8x64,
24+
tags: [.validation, .SIMD]
25+
),
26+
BenchmarkInfo(
27+
name: "SIMDRandomMask.Int64x2",
28+
runFunction: run_SIMDRandomMaskInt64x2,
29+
tags: [.validation, .SIMD]
30+
),
31+
BenchmarkInfo(
32+
name: "SIMDRandomMask.Int64x8",
33+
runFunction: run_SIMDRandomMaskInt64x8,
34+
tags: [.validation, .SIMD]
35+
),
36+
BenchmarkInfo(
37+
name: "SIMDRandomMask.Int64x64",
38+
runFunction: run_SIMDRandomMaskInt64x64,
39+
tags: [.validation, .SIMD]
40+
)
41+
]
42+
43+
@inline(never)
44+
public func run_SIMDRandomMaskInt8x16(_ N: Int) {
45+
var g = SplitMix64(seed: 0)
46+
var accum = SIMDMask<SIMD16<Int8>>()
47+
for _ in 0 ..< 10000*N {
48+
accum .^= SIMDMask.random(using: &g)
49+
}
50+
blackHole(accum)
51+
}
52+
53+
@inline(never)
54+
public func run_SIMDRandomMaskInt8x64(_ N: Int) {
55+
var g = SplitMix64(seed: 0)
56+
var accum = SIMDMask<SIMD64<Int8>>()
57+
for _ in 0 ..< 10000*N {
58+
accum .^= SIMDMask.random(using: &g)
59+
}
60+
blackHole(accum)
61+
}
62+
63+
@inline(never)
64+
public func run_SIMDRandomMaskInt64x2(_ N: Int) {
65+
var g = SplitMix64(seed: 0)
66+
var accum = SIMDMask<SIMD2<Int64>>()
67+
for _ in 0 ..< 10000*N {
68+
accum .^= SIMDMask.random(using: &g)
69+
}
70+
blackHole(accum)
71+
}
72+
73+
@inline(never)
74+
public func run_SIMDRandomMaskInt64x8(_ N: Int) {
75+
var g = SplitMix64(seed: 0)
76+
var accum = SIMDMask<SIMD8<Int64>>()
77+
for _ in 0 ..< 10000*N {
78+
accum .^= SIMDMask.random(using: &g)
79+
}
80+
blackHole(accum)
81+
}
82+
83+
@inline(never)
84+
public func run_SIMDRandomMaskInt64x64(_ N: Int) {
85+
var g = SplitMix64(seed: 0)
86+
var accum = SIMDMask<SIMD64<Int64>>()
87+
for _ in 0 ..< 10000*N {
88+
accum .^= SIMDMask.random(using: &g)
89+
}
90+
blackHole(accum)
91+
}
92+

benchmark/utils/main.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ import ReduceInto
156156
import RemoveWhere
157157
import ReversedCollections
158158
import RomanNumbers
159+
import SIMDRandomMask
159160
import SIMDReduceInteger
160161
import SequenceAlgos
161162
import SetTests
@@ -353,6 +354,7 @@ registerBenchmark(ReduceInto)
353354
registerBenchmark(RemoveWhere)
354355
registerBenchmark(ReversedCollections)
355356
registerBenchmark(RomanNumbers)
357+
registerBenchmark(SIMDRandomMask)
356358
registerBenchmark(SIMDReduceInteger)
357359
registerBenchmark(SequenceAlgos)
358360
registerBenchmark(SetTests)

lib/AST/Builtins.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,14 @@ static ValueDecl *getCastOperation(ASTContext &Context, Identifier Id,
586586
BIT->isFixedWidth() &&
587587
BIT->getFixedWidth() == Vec->getNumElements())
588588
break;
589+
// And IntN -> VecNxInt1 for SIMDMask random generators.
590+
if (auto *Vec = CheckOutput->getAs<BuiltinVectorType>())
591+
if (auto *BIT = CheckInput->getAs<BuiltinIntegerType>())
592+
if (auto *Element = Vec->getElementType()->getAs<BuiltinIntegerType>())
593+
if (Element->getFixedWidth() == 1 &&
594+
BIT->isFixedWidth() &&
595+
BIT->getFixedWidth() == Vec->getNumElements())
596+
break;
589597

590598
// FIXME: Implement bitcast typechecking.
591599
llvm_unreachable("Bitcast not supported yet!");

test/IRGen/builtins.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,12 @@ func vector_bitcast_test(_ src: Builtin.Vec16xInt8) -> Builtin.Int16 {
166166
return Builtin.bitcast_Vec16xInt1_Int16(mask) // CHECK: bitcast
167167
}
168168

169+
func vector_bitcast_test_ii(_ src: Builtin.Int16) -> Builtin.Vec16xInt8 {
170+
// CHECK: vector_bitcast_test_ii
171+
let v16x1 = Builtin.bitcast_Int16_Vec16xInt1(src) // CHECK: bitcast
172+
return Builtin.sext_Vec16xInt1_Vec16xInt8(v16x1) // CHECK: sext
173+
}
174+
169175
func intrinsic_test(_ i32: inout Builtin.Int32, i16: inout Builtin.Int16,
170176
_ v8i16: Builtin.Vec8xInt16) {
171177
// CHECK: intrinsic_test

0 commit comments

Comments
 (0)