@@ -50,6 +50,29 @@ import scala.language.higherKinds
50
50
*/
51
51
object OpenCL {
52
52
53
+ final case class PlatformId [Owner <: Singleton with OpenCL ](handle : Long ) extends AnyVal {
54
+
55
+ final def deviceIdsByType (deviceType : Int ): Seq [DeviceId [Owner ]] = {
56
+ val Array (numberOfDevices) = {
57
+ val a = Array (0 )
58
+ checkErrorCode(clGetDeviceIDs(handle, deviceType, null , a))
59
+ a
60
+ }
61
+ val stack = stackPush()
62
+ try {
63
+ val deviceIdBuffer = stack.mallocPointer(numberOfDevices)
64
+ checkErrorCode(clGetDeviceIDs(handle, deviceType, deviceIdBuffer, null : IntBuffer ))
65
+ for (i <- 0 until numberOfDevices) yield {
66
+ val deviceId = deviceIdBuffer.get(i)
67
+ new DeviceId [Owner ](deviceId)
68
+ }
69
+ } finally {
70
+ stack.close()
71
+ }
72
+ }
73
+
74
+ }
75
+
53
76
/** Returns a [[String ]] for the C string `address`.
54
77
*
55
78
* @note We don't know the exact charset of the C string. Use [[memASCII ]] because lwjgl treats them as ASCII.
@@ -96,33 +119,33 @@ object OpenCL {
96
119
}
97
120
})
98
121
object Exceptions {
99
- final class MisalignedSubBufferOffset extends IllegalArgumentException
122
+ final class MisalignedSubBufferOffset ( message : String = null ) extends IllegalArgumentException (message)
100
123
101
- final class ExecStatusErrorForEventsInWaitList extends IllegalArgumentException
124
+ final class ExecStatusErrorForEventsInWaitList ( message : String = null ) extends IllegalArgumentException (message)
102
125
103
- final class InvalidProperty extends IllegalArgumentException
126
+ final class InvalidProperty ( message : String = null ) extends IllegalArgumentException (message)
104
127
105
- final class PlatformNotFoundKhr extends IllegalStateException
128
+ final class PlatformNotFoundKhr ( message : String = null ) extends NoSuchElementException (message)
106
129
107
- final class DeviceNotFound extends IllegalArgumentException
130
+ final class DeviceNotFound ( message : String = null ) extends NoSuchElementException (message)
108
131
109
- final class DeviceNotAvailable extends IllegalStateException
132
+ final class DeviceNotAvailable ( message : String = null ) extends IllegalStateException (message)
110
133
111
- final class CompilerNotAvailable extends IllegalStateException
134
+ final class CompilerNotAvailable ( message : String = null ) extends IllegalStateException (message)
112
135
113
- final class MemObjectAllocationFailure extends IllegalStateException
136
+ final class MemObjectAllocationFailure ( message : String = null ) extends IllegalStateException (message)
114
137
115
- final class OutOfResources extends IllegalStateException
138
+ final class OutOfResources ( message : String = null ) extends IllegalStateException (message)
116
139
117
- final class OutOfHostMemory extends IllegalStateException
140
+ final class OutOfHostMemory ( message : String = null ) extends IllegalStateException (message)
118
141
119
- final class ProfilingInfoNotAvailable extends IllegalStateException
142
+ final class ProfilingInfoNotAvailable ( message : String = null ) extends IllegalStateException (message)
120
143
121
- final class MemCopyOverlap extends IllegalStateException
144
+ final class MemCopyOverlap ( message : String = null ) extends IllegalStateException (message)
122
145
123
- final class ImageFormatMismatch extends IllegalStateException
146
+ final class ImageFormatMismatch ( message : String = null ) extends IllegalStateException (message)
124
147
125
- final class ImageFormatNotSupported extends IllegalStateException
148
+ final class ImageFormatNotSupported ( message : String = null ) extends IllegalStateException (message)
126
149
127
150
final class BuildProgramFailure (buildLogs : Map [Long /* device id */ , String ] = Map .empty)
128
151
extends IllegalStateException ({
@@ -134,71 +157,71 @@ object OpenCL {
134
157
.mkString(" \n " )
135
158
})
136
159
137
- final class MapFailure extends IllegalStateException
160
+ final class MapFailure ( message : String = null ) extends IllegalStateException (message)
138
161
139
- final class InvalidValue extends IllegalArgumentException
162
+ final class InvalidValue ( message : String = null ) extends IllegalArgumentException (message)
140
163
141
- final class InvalidDeviceType extends IllegalArgumentException
164
+ final class InvalidDeviceType ( message : String = null ) extends IllegalArgumentException (message)
142
165
143
- final class InvalidPlatform extends IllegalArgumentException
166
+ final class InvalidPlatform ( message : String = null ) extends IllegalArgumentException (message)
144
167
145
- final class InvalidDevice extends IllegalArgumentException
168
+ final class InvalidDevice ( message : String = null ) extends IllegalArgumentException (message)
146
169
147
- final class InvalidContext extends IllegalArgumentException
170
+ final class InvalidContext ( message : String = null ) extends IllegalArgumentException (message)
148
171
149
- final class InvalidQueueProperties extends IllegalArgumentException
172
+ final class InvalidQueueProperties ( message : String = null ) extends IllegalArgumentException (message)
150
173
151
- final class InvalidCommandQueue extends IllegalArgumentException
174
+ final class InvalidCommandQueue ( message : String = null ) extends IllegalArgumentException (message)
152
175
153
- final class InvalidHostPtr extends IllegalArgumentException
176
+ final class InvalidHostPtr ( message : String = null ) extends IllegalArgumentException (message)
154
177
155
- final class InvalidMemObject extends IllegalArgumentException
178
+ final class InvalidMemObject ( message : String = null ) extends IllegalArgumentException (message)
156
179
157
- final class InvalidImageFormatDescriptor extends IllegalArgumentException
180
+ final class InvalidImageFormatDescriptor ( message : String = null ) extends IllegalArgumentException (message)
158
181
159
- final class InvalidImageSize extends IllegalArgumentException
182
+ final class InvalidImageSize ( message : String = null ) extends IllegalArgumentException (message)
160
183
161
- final class InvalidSampler extends IllegalArgumentException
184
+ final class InvalidSampler ( message : String = null ) extends IllegalArgumentException (message)
162
185
163
- final class InvalidBinary extends IllegalArgumentException
186
+ final class InvalidBinary ( message : String = null ) extends IllegalArgumentException (message)
164
187
165
- final class InvalidBuildOptions extends IllegalArgumentException
188
+ final class InvalidBuildOptions ( message : String = null ) extends IllegalArgumentException (message)
166
189
167
- final class InvalidProgram extends IllegalArgumentException
190
+ final class InvalidProgram ( message : String = null ) extends IllegalArgumentException (message)
168
191
169
- final class InvalidProgramExecutable extends IllegalArgumentException
192
+ final class InvalidProgramExecutable ( message : String = null ) extends IllegalArgumentException (message)
170
193
171
- final class InvalidKernelName extends IllegalArgumentException
194
+ final class InvalidKernelName ( message : String = null ) extends IllegalArgumentException (message)
172
195
173
- final class InvalidKernelDefinition extends IllegalArgumentException
196
+ final class InvalidKernelDefinition ( message : String = null ) extends IllegalArgumentException (message)
174
197
175
- final class InvalidKernel extends IllegalArgumentException
198
+ final class InvalidKernel ( message : String = null ) extends IllegalArgumentException (message)
176
199
177
- final class InvalidArgIndex extends IllegalArgumentException
200
+ final class InvalidArgIndex ( message : String = null ) extends IllegalArgumentException (message)
178
201
179
- final class InvalidArgValue extends IllegalArgumentException
202
+ final class InvalidArgValue ( message : String = null ) extends IllegalArgumentException (message)
180
203
181
- final class InvalidArgSize extends IllegalArgumentException
204
+ final class InvalidArgSize ( message : String = null ) extends IllegalArgumentException (message)
182
205
183
- final class InvalidKernelArgs extends IllegalArgumentException
206
+ final class InvalidKernelArgs ( message : String = null ) extends IllegalArgumentException (message)
184
207
185
- final class InvalidWorkDimension extends IllegalArgumentException
208
+ final class InvalidWorkDimension ( message : String = null ) extends IllegalArgumentException (message)
186
209
187
- final class InvalidWorkGroupSize extends IllegalArgumentException
210
+ final class InvalidWorkGroupSize ( message : String = null ) extends IllegalArgumentException (message)
188
211
189
- final class InvalidWorkItemSize extends IllegalArgumentException
212
+ final class InvalidWorkItemSize ( message : String = null ) extends IllegalArgumentException (message)
190
213
191
- final class InvalidGlobalOffset extends IllegalArgumentException
214
+ final class InvalidGlobalOffset ( message : String = null ) extends IllegalArgumentException (message)
192
215
193
- final class InvalidEventWaitList extends IllegalArgumentException
216
+ final class InvalidEventWaitList ( message : String = null ) extends IllegalArgumentException (message)
194
217
195
- final class InvalidEvent extends IllegalArgumentException
218
+ final class InvalidEvent ( message : String = null ) extends IllegalArgumentException (message)
196
219
197
- final class InvalidOperation extends IllegalArgumentException
220
+ final class InvalidOperation ( message : String = null ) extends IllegalArgumentException (message)
198
221
199
- final class InvalidBufferSize extends IllegalArgumentException
222
+ final class InvalidBufferSize ( message : String = null ) extends IllegalArgumentException (message)
200
223
201
- final class InvalidGlobalWorkSize extends IllegalArgumentException
224
+ final class InvalidGlobalWorkSize ( message : String = null ) extends IllegalArgumentException (message)
202
225
203
226
final class UnknownErrorCode (errorCode : Int ) extends IllegalStateException (s " Unknown error code: $errorCode" )
204
227
@@ -265,25 +288,18 @@ object OpenCL {
265
288
}
266
289
}
267
290
268
- trait UseFirstPlatform {
291
+ trait UseFirstPlatform extends OpenCL {
269
292
@ transient
270
- protected lazy val platformId : Long = {
271
- val stack = stackPush()
272
- try {
273
- val platformIdBuffer = stack.mallocPointer(1 )
274
- checkErrorCode(clGetPlatformIDs(platformIdBuffer, null : IntBuffer ))
275
- platformIdBuffer.get(0 )
276
- } finally {
277
- stack.close()
278
- }
293
+ protected lazy val platformId : PlatformId = {
294
+ platformIds.head
279
295
}
280
296
}
281
297
282
298
trait UseAllDevices extends OpenCL {
283
299
284
300
@ transient
285
301
protected lazy val deviceIds : Seq [DeviceId ] = {
286
- deviceIdsByType(CL_DEVICE_TYPE_ALL )
302
+ platformId. deviceIdsByType(CL_DEVICE_TYPE_ALL )
287
303
}
288
304
289
305
}
@@ -292,7 +308,7 @@ object OpenCL {
292
308
293
309
@ transient
294
310
protected lazy val deviceIds : Seq [DeviceId ] = {
295
- val allDeviceIds = deviceIdsByType(CL_DEVICE_TYPE_ALL )
311
+ val allDeviceIds = platformId. deviceIdsByType(CL_DEVICE_TYPE_ALL )
296
312
Seq (allDeviceIds.head)
297
313
}
298
314
@@ -302,23 +318,23 @@ object OpenCL {
302
318
303
319
@ transient
304
320
protected lazy val deviceIds : Seq [DeviceId ] = {
305
- deviceIdsByType(CL_DEVICE_TYPE_GPU )
321
+ platformId. deviceIdsByType(CL_DEVICE_TYPE_GPU )
306
322
}
307
323
}
308
324
309
325
trait UseFirstGpuDevice extends OpenCL {
310
326
311
327
@ transient
312
328
protected lazy val deviceIds : Seq [DeviceId ] = {
313
- val allDeviceIds = deviceIdsByType(CL_DEVICE_TYPE_GPU )
329
+ val allDeviceIds = platformId. deviceIdsByType(CL_DEVICE_TYPE_GPU )
314
330
Seq (allDeviceIds.head)
315
331
}
316
332
}
317
333
trait UseFirstCpuDevice extends OpenCL {
318
334
319
335
@ transient
320
336
protected lazy val deviceIds : Seq [DeviceId ] = {
321
- val allDeviceIds = deviceIdsByType(CL_DEVICE_TYPE_CPU )
337
+ val allDeviceIds = platformId. deviceIdsByType(CL_DEVICE_TYPE_CPU )
322
338
Seq (allDeviceIds.head)
323
339
}
324
340
}
@@ -327,7 +343,7 @@ object OpenCL {
327
343
328
344
@ transient
329
345
protected lazy val deviceIds : Seq [DeviceId ] = {
330
- deviceIdsByType(CL_DEVICE_TYPE_CPU )
346
+ platformId. deviceIdsByType(CL_DEVICE_TYPE_CPU )
331
347
}
332
348
}
333
349
@@ -1010,20 +1026,18 @@ trait OpenCL extends MonadicCloseable[UnitContinuation] with ImplicitsSingleton
1010
1026
type Event = OpenCL .Event [this .type ]
1011
1027
type CommandQueue = OpenCL .CommandQueue [this .type ]
1012
1028
type DeviceId = OpenCL .DeviceId [this .type ]
1029
+ type PlatformId = OpenCL .PlatformId [this .type ]
1013
1030
1014
- protected final def deviceIdsByType (deviceType : Int ): Seq [DeviceId ] = {
1015
- val Array (numberOfDevices) = {
1016
- val a = Array (0 )
1017
- checkErrorCode(clGetDeviceIDs(platformId, deviceType, null , a))
1018
- a
1019
- }
1031
+ def platformIds : Seq [PlatformId ] = {
1020
1032
val stack = stackPush()
1021
1033
try {
1022
- val deviceIdBuffer = stack.mallocPointer(numberOfDevices)
1023
- checkErrorCode(clGetDeviceIDs(platformId, deviceType, deviceIdBuffer, null : IntBuffer ))
1024
- for (i <- 0 until deviceIdBuffer.capacity()) yield {
1025
- val deviceId = deviceIdBuffer.get(i)
1026
- new DeviceId (deviceId)
1034
+ val numberOfPlatformsBuffer = stack.mallocInt(1 )
1035
+ checkErrorCode(clGetPlatformIDs(null , numberOfPlatformsBuffer))
1036
+ val numberOfPlatforms = numberOfPlatformsBuffer.get(0 )
1037
+ val platformIdBuffer = stack.mallocPointer(numberOfPlatforms)
1038
+ checkErrorCode(clGetPlatformIDs(platformIdBuffer, null : IntBuffer ))
1039
+ (0 until numberOfPlatforms).map { i =>
1040
+ new PlatformId (platformIdBuffer.get(i))
1027
1041
}
1028
1042
} finally {
1029
1043
stack.close()
@@ -1174,20 +1188,20 @@ trait OpenCL extends MonadicCloseable[UnitContinuation] with ImplicitsSingleton
1174
1188
1175
1189
import OpenCL ._
1176
1190
1177
- protected val platformId : Long
1191
+ protected val platformId : PlatformId
1178
1192
protected val deviceIds : Seq [DeviceId ]
1179
1193
1180
1194
@ transient
1181
1195
protected lazy val platformCapabilities : CLCapabilities = {
1182
- CL .createPlatformCapabilities(platformId)
1196
+ CL .createPlatformCapabilities(platformId.handle )
1183
1197
}
1184
1198
1185
1199
protected def createCommandQueue (deviceId : DeviceId , properties : Map [Int , Long ]): CommandQueue = new CommandQueue (
1186
1200
if (deviceCapabilities(deviceId).OpenCL20 ) {
1187
1201
val cl20Properties = (properties.view.flatMap { case (key, value) => Seq (key, value) } ++ Seq (0L )).toArray
1188
1202
val a = Array (0 )
1189
1203
val commandQueue =
1190
- clCreateCommandQueueWithProperties(platformId, deviceId.handle, cl20Properties, a)
1204
+ clCreateCommandQueueWithProperties(platformId.handle , deviceId.handle, cl20Properties, a)
1191
1205
checkErrorCode(a(0 ))
1192
1206
commandQueue
1193
1207
} else {
@@ -1211,7 +1225,7 @@ trait OpenCL extends MonadicCloseable[UnitContinuation] with ImplicitsSingleton
1211
1225
val stack = stackPush()
1212
1226
try {
1213
1227
val errorCodeBuffer = stack.ints(CL_SUCCESS )
1214
- val contextProperties = stack.pointers(CL_CONTEXT_PLATFORM , platformId, 0 )
1228
+ val contextProperties = stack.pointers(CL_CONTEXT_PLATFORM , platformId.handle , 0 )
1215
1229
val deviceIdBuffer = stack.pointers(deviceIds.view.map(_.handle): _* )
1216
1230
val context =
1217
1231
clCreateContext(contextProperties,
0 commit comments