This repository has been archived by the owner on Nov 3, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathLookup.kt
127 lines (111 loc) · 3.44 KB
/
Lookup.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package com.komputation.instructions.entry
import com.komputation.cpu.functions.copy
import com.komputation.cpu.instructions.CpuEntryPointInstruction
import com.komputation.cpu.layers.entry.CpuLookup
import com.komputation.cuda.CudaContext
import com.komputation.cuda.instructions.CudaEntryPointInstruction
import com.komputation.cuda.kernels.ArrayKernels
import com.komputation.cuda.kernels.EntryKernels
import com.komputation.cuda.layers.entry.CudaLookup
import com.komputation.optimization.OptimizationInstruction
class Lookup(
private val name : String? = null,
private val vectors: Array<FloatArray>,
private val minimumLength: Int,
private val maximumLength: Int,
private val dimension : Int,
private val optimization : OptimizationInstruction?) : CpuEntryPointInstruction, CudaEntryPointInstruction {
override val numberOutputRows
get() = this.dimension
override val minimumNumberOutputColumns
get() = this.minimumLength
override val maximumNumberOutputColumns
get() = this.maximumLength
override fun buildForCpu(): CpuLookup {
val updateRule = if (this.optimization != null) {
this.optimization.buildForCpu().invoke(this.vectors.size, this.dimension)
}
else {
null
}
return CpuLookup(this.name, this.vectors, this.dimension, this.minimumNumberOutputColumns, this.maximumLength, updateRule)
}
override fun buildForCuda(context: CudaContext): CudaLookup {
val updateRule = if (this.optimization != null) {
this.optimization.buildForCuda(context).invoke(this.vectors.size, this.dimension, 1)
}
else {
null
}
val concatenation = FloatArray(this.vectors.size * this.dimension)
for ((index, vector) in this.vectors.withIndex()) {
copy(vector, index * this.dimension, this.dimension, concatenation)
}
return CudaLookup(
this.name,
concatenation,
this.maximumLength,
this.minimumLength == this.maximumLength,
this.dimension,
updateRule,
{ context.createKernel(EntryKernels.lookup())},
{ context.createKernel(ArrayKernels.groupSum())},
context.maximumNumberOfThreadsPerBlock)
}
}
fun lookup(
vectors: Array<FloatArray>,
maximumLength: Int,
dimension: Int,
optimization: OptimizationInstruction? = null) =
lookup(
null,
vectors,
1,
maximumLength,
dimension,
optimization
)
fun lookup(
vectors: Array<FloatArray>,
minimumLength: Int,
maximumLength: Int,
dimension: Int,
optimization: OptimizationInstruction? = null) =
lookup(
null,
vectors,
minimumLength,
maximumLength,
dimension,
optimization
)
fun lookup(
name: String? = null,
vectors: Array<FloatArray>,
maximumLength: Int,
dimension: Int,
optimization: OptimizationInstruction? = null) =
lookup(
name,
vectors,
1,
maximumLength,
dimension,
optimization
)
fun lookup(
name: String? = null,
vectors: Array<FloatArray>,
minimumLength: Int,
maximumLength: Int,
dimension: Int,
optimization: OptimizationInstruction? = null) =
Lookup(
name,
vectors,
minimumLength,
maximumLength,
dimension,
optimization
)