Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/cuda/CudaDevice.cpp
5990 views
1
/*******************************************************************************
2
* Copyright (c) 2013, 2016 IBM Corp. and others
3
*
4
* This program and the accompanying materials are made available under
5
* the terms of the Eclipse Public License 2.0 which accompanies this
6
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
7
* or the Apache License, Version 2.0 which accompanies this distribution and
8
* is available at https://www.apache.org/licenses/LICENSE-2.0.
9
*
10
* This Source Code may also be made available under the following
11
* Secondary Licenses when the conditions for such availability set
12
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
13
* General Public License, version 2 with the GNU Classpath
14
* Exception [1] and GNU General Public License, version 2 with the
15
* OpenJDK Assembly Exception [2].
16
*
17
* [1] https://www.gnu.org/software/classpath/license.html
18
* [2] http://openjdk.java.net/legal/assembly-exception.html
19
*
20
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
21
*******************************************************************************/
22
23
#include "CudaCommon.hpp"
24
#include "java/com_ibm_cuda_CudaDevice.h"
25
26
#ifdef OMR_OPT_CUDA
27
28
namespace
29
{
30
31
/**
32
* Instances of this class convey the necessary information to trigger a callback
33
* to a Java Runnable object.
34
*/
35
class Callback {
36
private:
37
static char threadName[];
38
static JavaVMAttachArgs vmAttachArgs;
39
40
JavaVM * jvm;
41
jobject runnable;
42
43
static void
44
handler(J9CudaStream stream, int32_t error, uintptr_t data)
45
{
46
Trc_cuda_deviceCallbackHandler_entry(stream, error, data);
47
48
Callback * callback = (Callback *)data;
49
JNIEnv * env = NULL;
50
jint status = callback->jvm->AttachCurrentThreadAsDaemon((void **)&env, &vmAttachArgs);
51
52
if (JNI_OK != status) {
53
Trc_cuda_deviceCallbackHandler_exitFail(status);
54
} else {
55
J9VMThread * thread = (J9VMThread *)env;
56
J9CudaGlobals * globals = thread->javaVM->cudaGlobals;
57
58
Assert_cuda_true(NULL != globals);
59
Assert_cuda_true(NULL != globals->runnable_run);
60
61
env->CallVoidMethod(callback->runnable, globals->runnable_run);
62
63
jthrowable throwable = env->ExceptionOccurred();
64
65
if (NULL != throwable) {
66
// This happens on a thread started by the CUDA runtime: there is no
67
// Java caller to catch this exception but we'll note that it occurred.
68
Trc_cuda_deviceCallbackHandler_exception(thread, throwable);
69
env->ExceptionClear();
70
}
71
72
env->DeleteGlobalRef(callback->runnable);
73
74
PORT_ACCESS_FROM_ENV(env);
75
76
J9CUDA_FREE_MEMORY(callback);
77
78
Trc_cuda_deviceCallbackHandler_exit(thread);
79
}
80
}
81
82
public:
83
VMINLINE static void
84
insert(JNIEnv * env, jint deviceId, jlong stream, jobject runnable)
85
{
86
J9VMThread * thread = (J9VMThread *)env;
87
88
Trc_cuda_deviceCallbackInsert_entry(thread, deviceId, (J9CudaStream)stream, runnable);
89
90
PORT_ACCESS_FROM_ENV(env);
91
92
Callback * callback = (Callback *)J9CUDA_ALLOCATE_MEMORY(sizeof(Callback));
93
int32_t error = J9CUDA_ERROR_MEMORY_ALLOCATION;
94
95
if (NULL == callback) {
96
Trc_cuda_deviceCallbackInsert_allocFail(thread);
97
goto fail;
98
}
99
100
callback->jvm = (JavaVM *)thread->javaVM;
101
callback->runnable = env->NewGlobalRef(runnable);
102
103
if (NULL == callback->runnable) {
104
Trc_cuda_deviceCallbackInsert_globalRefFail(thread);
105
} else {
106
error = j9cuda_streamAddCallback(
107
(uint32_t)deviceId,
108
(J9CudaStream)stream,
109
handler,
110
(uintptr_t)callback);
111
}
112
113
if (0 != error) {
114
if (NULL != callback->runnable) {
115
env->DeleteGlobalRef(callback->runnable);
116
}
117
118
J9CUDA_FREE_MEMORY(callback);
119
120
fail:
121
throwCudaException(env, error);
122
}
123
124
Trc_cuda_deviceCallbackInsert_exit(thread, error);
125
}
126
};
127
128
char Callback::threadName[] = "cuda4j-callback";
129
JavaVMAttachArgs Callback::vmAttachArgs = { JNI_VERSION_1_6, threadName, NULL };
130
131
} // namespace
132
133
#endif /* OMR_OPT_CUDA */
134
135
/**
136
* Add a callback to a stream or the default stream of a device.
137
*
138
* Class: com.ibm.cuda.CudaDevice
139
* Method: addCallback
140
* Signature: (IJLjava/lang/Runnable;)V
141
*
142
* @param[in] env the JNI interface pointer
143
* @param[in] (unused) the class pointer
144
* @param[in] deviceId the device identifier
145
* @param[in] stream the stream, or null for the default stream
146
* @param[in] callback the callback object
147
*/
148
void JNICALL
149
Java_com_ibm_cuda_CudaDevice_addCallback
150
(JNIEnv * env, jclass, jint deviceId, jlong stream, jobject callback)
151
{
152
J9VMThread * thread = (J9VMThread *)env;
153
154
#ifdef OMR_OPT_CUDA
155
Trc_cuda_deviceAddCallback_entry(thread, deviceId, (uintptr_t)stream, (uintptr_t)callback);
156
157
Callback::insert(env, deviceId, stream, callback);
158
#else /* OMR_OPT_CUDA */
159
throwCudaException(env, J9CUDA_ERROR_NO_DEVICE);
160
#endif /* OMR_OPT_CUDA */
161
162
Trc_cuda_deviceAddCallback_exit(thread);
163
}
164
165
/**
166
* Query whether a device can access a peer device.
167
*
168
* Class: com.ibm.cuda.CudaDevice
169
* Method: canAccessPeer
170
* Signature: (II)Z
171
*
172
* @param[in] env the JNI interface pointer
173
* @param[in] (unused) the class pointer
174
* @param[in] deviceId the device identifier
175
* @param[in] peerDeviceId the peer device identifier
176
* @return whether deviceId can access peerDeviceId
177
*/
178
jboolean JNICALL
179
Java_com_ibm_cuda_CudaDevice_canAccessPeer
180
(JNIEnv * env, jclass, jint deviceId, jint peerDeviceId)
181
{
182
J9VMThread * thread = (J9VMThread *)env;
183
184
Trc_cuda_deviceCanAccessPeer_entry(thread, deviceId, peerDeviceId);
185
186
BOOLEAN result = 0;
187
int32_t error = J9CUDA_ERROR_NO_DEVICE;
188
#ifdef OMR_OPT_CUDA
189
PORT_ACCESS_FROM_ENV(env);
190
error = j9cuda_deviceCanAccessPeer((uint32_t)deviceId, (uint32_t)peerDeviceId, &result);
191
#endif /* OMR_OPT_CUDA */
192
193
if (0 != error) {
194
throwCudaException(env, error);
195
}
196
197
Trc_cuda_deviceCanAccessPeer_exit(thread, 0 != result);
198
199
return (jboolean)(0 != result);
200
}
201
202
/**
203
* Disable access to a peer device.
204
*
205
* Class: com.ibm.cuda.CudaDevice
206
* Method: disablePeerAccess
207
* Signature: (II)V
208
*
209
* @param[in] env the JNI interface pointer
210
* @param[in] (unused) the class pointer
211
* @param[in] deviceId the device identifier
212
* @param[in] peerDeviceId the peer device identifier
213
*/
214
void JNICALL
215
Java_com_ibm_cuda_CudaDevice_disablePeerAccess
216
(JNIEnv * env, jclass, jint deviceId, jint peerDeviceId)
217
{
218
J9VMThread * thread = (J9VMThread *)env;
219
220
Trc_cuda_deviceDisablePeerAccess_entry(thread, deviceId, peerDeviceId);
221
222
int32_t error = J9CUDA_ERROR_NO_DEVICE;
223
#ifdef OMR_OPT_CUDA
224
PORT_ACCESS_FROM_ENV(env);
225
error = j9cuda_deviceDisablePeerAccess((uint32_t)deviceId, (uint32_t)peerDeviceId);
226
#endif /* OMR_OPT_CUDA */
227
228
if (0 != error) {
229
throwCudaException(env, error);
230
}
231
232
Trc_cuda_deviceDisablePeerAccess_exit(thread);
233
}
234
235
/**
236
* Enable access to a peer device.
237
*
238
* Class: com.ibm.cuda.CudaDevice
239
* Method: enablePeerAccess
240
* Signature: (II)V
241
*
242
* @param[in] env the JNI interface pointer
243
* @param[in] (unused) the class pointer
244
* @param[in] deviceId the device identifier
245
* @param[in] peerDeviceId the peer device identifier
246
*/
247
void JNICALL
248
Java_com_ibm_cuda_CudaDevice_enablePeerAccess
249
(JNIEnv * env, jclass, jint deviceId, jint peerDeviceId)
250
{
251
J9VMThread * thread = (J9VMThread *)env;
252
253
Trc_cuda_deviceEnablePeerAccess_entry(thread, deviceId, peerDeviceId);
254
255
int32_t error = J9CUDA_ERROR_NO_DEVICE;
256
#ifdef OMR_OPT_CUDA
257
PORT_ACCESS_FROM_ENV(env);
258
error = j9cuda_deviceEnablePeerAccess((uint32_t)deviceId, (uint32_t)peerDeviceId);
259
#endif /* OMR_OPT_CUDA */
260
261
if (0 != error) {
262
throwCudaException(env, error);
263
}
264
265
Trc_cuda_deviceEnablePeerAccess_exit(thread);
266
}
267
268
/**
269
* Query a device attribute.
270
*
271
* Class: com.ibm.cuda.CudaDevice
272
* Method: getAttribute
273
* Signature: (II)I
274
*
275
* @param[in] env the JNI interface pointer
276
* @param[in] (unused) the class pointer
277
* @param[in] deviceId the device identifier
278
* @param[in] attribute the attribute to query
279
* @return the value of the requested attribute
280
*/
281
jint JNICALL
282
Java_com_ibm_cuda_CudaDevice_getAttribute
283
(JNIEnv * env, jclass, jint deviceId, jint attribute)
284
{
285
J9VMThread * thread = (J9VMThread *)env;
286
287
Trc_cuda_deviceGetAttribute_entry(thread, deviceId, attribute);
288
289
int32_t value = 0;
290
int32_t error = J9CUDA_ERROR_NO_DEVICE;
291
#ifdef OMR_OPT_CUDA
292
PORT_ACCESS_FROM_ENV(env);
293
error = J9CUDA_ERROR_INVALID_VALUE;
294
J9CudaDeviceAttribute j9attrib = J9CUDA_DEVICE_ATTRIBUTE_WARP_SIZE;
295
296
switch (attribute) {
297
default:
298
goto fail;
299
case com_ibm_cuda_CudaDevice_ATTRIBUTE_ASYNC_ENGINE_COUNT:
300
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT;
301
break;
302
case com_ibm_cuda_CudaDevice_ATTRIBUTE_CAN_MAP_HOST_MEMORY:
303
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_CAN_MAP_HOST_MEMORY;
304
break;
305
case com_ibm_cuda_CudaDevice_ATTRIBUTE_CLOCK_RATE:
306
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_CLOCK_RATE;
307
break;
308
case com_ibm_cuda_CudaDevice_ATTRIBUTE_COMPUTE_CAPABILITY:
309
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY;
310
break;
311
case com_ibm_cuda_CudaDevice_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR:
312
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR;
313
break;
314
case com_ibm_cuda_CudaDevice_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR:
315
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR;
316
break;
317
case com_ibm_cuda_CudaDevice_ATTRIBUTE_COMPUTE_MODE:
318
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_COMPUTE_MODE;
319
break;
320
case com_ibm_cuda_CudaDevice_ATTRIBUTE_CONCURRENT_KERNELS:
321
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_CONCURRENT_KERNELS;
322
break;
323
case com_ibm_cuda_CudaDevice_ATTRIBUTE_ECC_ENABLED:
324
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_ECC_ENABLED;
325
break;
326
case com_ibm_cuda_CudaDevice_ATTRIBUTE_GLOBAL_MEMORY_BUS_WIDTH:
327
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_GLOBAL_MEMORY_BUS_WIDTH;
328
break;
329
case com_ibm_cuda_CudaDevice_ATTRIBUTE_INTEGRATED:
330
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_INTEGRATED;
331
break;
332
case com_ibm_cuda_CudaDevice_ATTRIBUTE_KERNEL_EXEC_TIMEOUT:
333
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_KERNEL_EXEC_TIMEOUT;
334
break;
335
case com_ibm_cuda_CudaDevice_ATTRIBUTE_L2_CACHE_SIZE:
336
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_L2_CACHE_SIZE;
337
break;
338
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_BLOCK_DIM_X:
339
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_X;
340
break;
341
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_BLOCK_DIM_Y:
342
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Y;
343
break;
344
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_BLOCK_DIM_Z:
345
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Z;
346
break;
347
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_GRID_DIM_X:
348
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_GRID_DIM_X;
349
break;
350
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_GRID_DIM_Y:
351
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Y;
352
break;
353
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_GRID_DIM_Z:
354
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Z;
355
break;
356
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_LAYERS:
357
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_LAYERS;
358
break;
359
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_WIDTH:
360
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_WIDTH;
361
break;
362
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE1D_WIDTH:
363
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_WIDTH;
364
break;
365
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE2D_HEIGHT:
366
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_HEIGHT;
367
break;
368
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_HEIGHT:
369
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_HEIGHT;
370
break;
371
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_LAYERS:
372
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_LAYERS;
373
break;
374
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_WIDTH:
375
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_WIDTH;
376
break;
377
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE2D_WIDTH:
378
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_WIDTH;
379
break;
380
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE3D_DEPTH:
381
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_DEPTH;
382
break;
383
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE3D_HEIGHT:
384
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_HEIGHT;
385
break;
386
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE3D_WIDTH:
387
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_WIDTH;
388
break;
389
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_LAYERS:
390
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_LAYERS;
391
break;
392
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_WIDTH:
393
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_WIDTH;
394
break;
395
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_WIDTH:
396
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_WIDTH;
397
break;
398
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_LAYERS:
399
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_LAYERS;
400
break;
401
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_WIDTH:
402
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_WIDTH;
403
break;
404
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE1D_LINEAR_WIDTH:
405
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LINEAR_WIDTH;
406
break;
407
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE1D_MIPMAPPED_WIDTH:
408
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_MIPMAPPED_WIDTH;
409
break;
410
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE1D_WIDTH:
411
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_WIDTH;
412
break;
413
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_HEIGHT:
414
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_HEIGHT;
415
break;
416
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_WIDTH:
417
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_WIDTH;
418
break;
419
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_HEIGHT:
420
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_HEIGHT;
421
break;
422
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_HEIGHT:
423
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_HEIGHT;
424
break;
425
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_LAYERS:
426
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_LAYERS;
427
break;
428
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_WIDTH:
429
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_WIDTH;
430
break;
431
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_HEIGHT:
432
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_HEIGHT;
433
break;
434
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_PITCH:
435
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_PITCH;
436
break;
437
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_WIDTH:
438
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_WIDTH;
439
break;
440
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_HEIGHT:
441
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_HEIGHT;
442
break;
443
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_WIDTH:
444
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_WIDTH;
445
break;
446
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_WIDTH:
447
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_WIDTH;
448
break;
449
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH:
450
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH;
451
break;
452
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH_ALTERNATE:
453
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH_ALTERNATE;
454
break;
455
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT:
456
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT;
457
break;
458
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT_ALTERNATE:
459
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT_ALTERNATE;
460
break;
461
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH:
462
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH;
463
break;
464
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH_ALTERNATE:
465
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH_ALTERNATE;
466
break;
467
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_LAYERS:
468
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_LAYERS;
469
break;
470
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_WIDTH:
471
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_WIDTH;
472
break;
473
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_WIDTH:
474
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_WIDTH;
475
break;
476
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_PITCH:
477
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_PITCH;
478
break;
479
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_REGISTERS_PER_BLOCK:
480
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_BLOCK;
481
break;
482
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK:
483
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK;
484
break;
485
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_THREADS_PER_BLOCK:
486
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_THREADS_PER_BLOCK;
487
break;
488
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_THREADS_PER_MULTIPROCESSOR:
489
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_THREADS_PER_MULTIPROCESSOR;
490
break;
491
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MEMORY_CLOCK_RATE:
492
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MEMORY_CLOCK_RATE;
493
break;
494
case com_ibm_cuda_CudaDevice_ATTRIBUTE_MULTIPROCESSOR_COUNT:
495
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT;
496
break;
497
case com_ibm_cuda_CudaDevice_ATTRIBUTE_PCI_BUS_ID:
498
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_PCI_BUS_ID;
499
break;
500
case com_ibm_cuda_CudaDevice_ATTRIBUTE_PCI_DEVICE_ID:
501
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_PCI_DEVICE_ID;
502
break;
503
case com_ibm_cuda_CudaDevice_ATTRIBUTE_PCI_DOMAIN_ID:
504
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID;
505
break;
506
case com_ibm_cuda_CudaDevice_ATTRIBUTE_STREAM_PRIORITIES_SUPPORTED:
507
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_STREAM_PRIORITIES_SUPPORTED;
508
break;
509
case com_ibm_cuda_CudaDevice_ATTRIBUTE_SURFACE_ALIGNMENT:
510
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_SURFACE_ALIGNMENT;
511
break;
512
case com_ibm_cuda_CudaDevice_ATTRIBUTE_TCC_DRIVER:
513
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_TCC_DRIVER;
514
break;
515
case com_ibm_cuda_CudaDevice_ATTRIBUTE_TEXTURE_ALIGNMENT:
516
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_TEXTURE_ALIGNMENT;
517
break;
518
case com_ibm_cuda_CudaDevice_ATTRIBUTE_TEXTURE_PITCH_ALIGNMENT:
519
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_TEXTURE_PITCH_ALIGNMENT;
520
break;
521
case com_ibm_cuda_CudaDevice_ATTRIBUTE_TOTAL_CONSTANT_MEMORY:
522
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_TOTAL_CONSTANT_MEMORY;
523
break;
524
case com_ibm_cuda_CudaDevice_ATTRIBUTE_UNIFIED_ADDRESSING:
525
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_UNIFIED_ADDRESSING;
526
break;
527
case com_ibm_cuda_CudaDevice_ATTRIBUTE_WARP_SIZE:
528
j9attrib = J9CUDA_DEVICE_ATTRIBUTE_WARP_SIZE;
529
break;
530
}
531
532
error = j9cuda_deviceGetAttribute((uint32_t)deviceId, j9attrib, &value);
533
#endif /* OMR_OPT_CUDA */
534
535
if (0 != error) {
536
#ifdef OMR_OPT_CUDA
537
fail:
538
#endif /* OMR_OPT_CUDA */
539
throwCudaException(env, error);
540
}
541
542
Trc_cuda_deviceGetAttribute_exit(thread, value);
543
544
return (jint)value;
545
}
546
547
/**
548
* Query the cache configuration of a device.
549
*
550
* Class: com.ibm.cuda.CudaDevice
551
* Method: getCacheConfig
552
* Signature: (I)I
553
*
554
* @param[in] env the JNI interface pointer
555
* @param[in] (unused) the class pointer
556
* @param[in] deviceId the device identifier
557
* @return the device cache configuration
558
*/
559
jint JNICALL
560
Java_com_ibm_cuda_CudaDevice_getCacheConfig
561
(JNIEnv * env, jclass, jint deviceId)
562
{
563
J9VMThread * thread = (J9VMThread *)env;
564
565
Trc_cuda_deviceGetCacheConfig_entry(thread, deviceId);
566
567
J9CudaCacheConfig config = J9CUDA_CACHE_CONFIG_PREFER_EQUAL;
568
int32_t error = J9CUDA_ERROR_NO_DEVICE;
569
#ifdef OMR_OPT_CUDA
570
PORT_ACCESS_FROM_ENV(env);
571
error = j9cuda_deviceGetCacheConfig((uint32_t)deviceId, &config);
572
#endif /* OMR_OPT_CUDA */
573
574
if (0 != error) {
575
throwCudaException(env, error);
576
}
577
578
Trc_cuda_deviceGetCacheConfig_exit(thread, config);
579
580
return (jint)config;
581
}
582
583
/**
584
* Query the amount of free memory on a device.
585
*
586
* Class: com.ibm.cuda.CudaDevice
587
* Method: getFreeMemory
588
* Signature: (I)J
589
*
590
* @param[in] env the JNI interface pointer
591
* @param[in] (unused) the class pointer
592
* @param[in] deviceId the device identifier
593
* @return the number of bytes of free memory on the device
594
*/
595
jlong JNICALL
596
Java_com_ibm_cuda_CudaDevice_getFreeMemory
597
(JNIEnv * env, jclass, jint deviceId)
598
{
599
J9VMThread * thread = (J9VMThread *)env;
600
601
Trc_cuda_deviceGetFreeMemory_entry(thread, deviceId);
602
603
uintptr_t freeBytes = 0;
604
int32_t error = J9CUDA_ERROR_NO_DEVICE;
605
#ifdef OMR_OPT_CUDA
606
PORT_ACCESS_FROM_ENV(env);
607
uintptr_t totalBytes = 0;
608
error = j9cuda_deviceGetMemInfo((uint32_t)deviceId, &freeBytes, &totalBytes);
609
#endif /* OMR_OPT_CUDA */
610
611
if (0 != error) {
612
throwCudaException(env, error);
613
}
614
615
Trc_cuda_deviceGetFreeMemory_exit(thread, freeBytes);
616
617
return (jlong)freeBytes;
618
}
619
620
/**
621
* Return the greatest stream priority for a device.
622
*
623
* Class: com.ibm.cuda.CudaDevice
624
* Method: getGreatestStreamPriority
625
* Signature: (I)I
626
*
627
* @param[in] env the JNI interface pointer
628
* @param[in] (unused) the class pointer
629
* @param[in] deviceId the device identifier
630
* @return the greatest stream priority
631
*/
632
jint JNICALL
633
Java_com_ibm_cuda_CudaDevice_getGreatestStreamPriority
634
(JNIEnv * env, jclass, jint deviceId)
635
{
636
J9VMThread * thread = (J9VMThread *)env;
637
638
Trc_cuda_deviceGetGreatestStreamPriority_entry(thread, deviceId);
639
640
int32_t greatestPriority = 0;
641
int32_t error = J9CUDA_ERROR_NO_DEVICE;
642
#ifdef OMR_OPT_CUDA
643
PORT_ACCESS_FROM_ENV(env);
644
int32_t leastPriority = 0;
645
error = j9cuda_deviceGetStreamPriorityRange((uint32_t)deviceId, &leastPriority, &greatestPriority);
646
#endif /* OMR_OPT_CUDA */
647
648
if (0 != error) {
649
throwCudaException(env, error);
650
}
651
652
Trc_cuda_deviceGetGreatestStreamPriority_exit(thread, greatestPriority);
653
654
return (jint)greatestPriority;
655
}
656
657
/**
658
* Return the least stream priority for a device.
659
*
660
* Class: com.ibm.cuda.CudaDevice
661
* Method: getLeastStreamPriority
662
* Signature: (I)I
663
*
664
* @param[in] env the JNI interface pointer
665
* @param[in] (unused) the class pointer
666
* @param[in] deviceId the device identifier
667
* @return the least stream priority
668
*/
669
jint JNICALL
670
Java_com_ibm_cuda_CudaDevice_getLeastStreamPriority
671
(JNIEnv * env, jclass, jint deviceId)
672
{
673
J9VMThread * thread = (J9VMThread *)env;
674
675
Trc_cuda_deviceGetLeastStreamPriority_entry(thread, deviceId);
676
677
int32_t leastPriority = 0;
678
int32_t error = J9CUDA_ERROR_NO_DEVICE;
679
#ifdef OMR_OPT_CUDA
680
PORT_ACCESS_FROM_ENV(env);
681
int32_t greatestPriority = 0;
682
error = j9cuda_deviceGetStreamPriorityRange((uint32_t)deviceId, &leastPriority, &greatestPriority);
683
#endif /* OMR_OPT_CUDA */
684
685
if (0 != error) {
686
throwCudaException(env, error);
687
}
688
689
Trc_cuda_deviceGetLeastStreamPriority_exit(thread, leastPriority);
690
691
return (jint)leastPriority;
692
}
693
694
/**
695
* Query a limit of a device.
696
*
697
* Class: com.ibm.cuda.CudaDevice
698
* Method: getLimit
699
* Signature: (II)J
700
*
701
* @param[in] env the JNI interface pointer
702
* @param[in] (unused) the class pointer
703
* @param[in] deviceId the device identifier
704
* @param[in] limit the requested limit
705
* @return the value of the requested limit
706
*/
707
jlong JNICALL
708
Java_com_ibm_cuda_CudaDevice_getLimit
709
(JNIEnv * env, jclass, jint deviceId, jint limit)
710
{
711
J9VMThread * thread = (J9VMThread *)env;
712
713
Trc_cuda_deviceGetLimit_entry(thread, deviceId, limit);
714
715
uintptr_t value = 0;
716
int32_t error = J9CUDA_ERROR_NO_DEVICE;
717
#ifdef OMR_OPT_CUDA
718
PORT_ACCESS_FROM_ENV(env);
719
error = j9cuda_deviceGetLimit((uint32_t)deviceId, (J9CudaDeviceLimit)limit, &value);
720
#endif /* OMR_OPT_CUDA */
721
722
if (0 != error) {
723
throwCudaException(env, error);
724
}
725
726
Trc_cuda_deviceGetLimit_exit(thread, value);
727
728
return (jlong)value;
729
}
730
731
/**
732
* Query the name of a device.
733
*
734
* Class: com.ibm.cuda.CudaDevice
735
* Method: getName
736
* Signature: (I)Ljava/lang/String;
737
*
738
* @param[in] env the JNI interface pointer
739
* @param[in] (unused) the class pointer
740
* @param[in] deviceId the device identifier
741
* @return the name of the device
742
*/
743
jstring JNICALL
744
Java_com_ibm_cuda_CudaDevice_getName
745
(JNIEnv * env, jclass, jint deviceId)
746
{
747
J9VMThread * thread = (J9VMThread *)env;
748
749
Trc_cuda_deviceGetName_entry(thread, deviceId);
750
751
jstring result = NULL;
752
char name[256];
753
754
name[0] = 0;
755
756
int32_t error = J9CUDA_ERROR_NO_DEVICE;
757
#ifdef OMR_OPT_CUDA
758
PORT_ACCESS_FROM_ENV(env);
759
error = j9cuda_deviceGetName((uint32_t)deviceId, (uint32_t)sizeof(name), name);
760
#endif /* OMR_OPT_CUDA */
761
762
if (0 != error) {
763
throwCudaException(env, error);
764
} else {
765
result = env->NewStringUTF(name);
766
}
767
768
Trc_cuda_deviceGetName_exit(thread, result, name);
769
770
return result;
771
}
772
773
/**
774
* Query the shared memory configuration of a device.
775
*
776
* Class: com.ibm.cuda.CudaDevice
777
* Method: getSharedMemConfig
778
* Signature: (I)I
779
*
780
* @param[in] env the JNI interface pointer
781
* @param[in] (unused) the class pointer
782
* @param[in] deviceId the device identifier
783
* @return the shared memory configuration
784
*/
785
jint JNICALL
786
Java_com_ibm_cuda_CudaDevice_getSharedMemConfig
787
(JNIEnv * env, jclass, jint deviceId)
788
{
789
J9VMThread * thread = (J9VMThread *)env;
790
791
Trc_cuda_deviceGetSharedMemConfig_entry(thread, deviceId);
792
793
J9CudaSharedMemConfig config = J9CUDA_SHARED_MEM_CONFIG_DEFAULT_BANK_SIZE;
794
int32_t error = J9CUDA_ERROR_NO_DEVICE;
795
#ifdef OMR_OPT_CUDA
796
PORT_ACCESS_FROM_ENV(env);
797
error = j9cuda_deviceGetSharedMemConfig((uint32_t)deviceId, &config);
798
#endif /* OMR_OPT_CUDA */
799
800
if (0 != error) {
801
throwCudaException(env, error);
802
}
803
804
Trc_cuda_deviceGetSharedMemConfig_exit(thread, config);
805
806
return (jint)config;
807
}
808
809
/**
810
* Query the total amount of memory on a device.
811
*
812
* Class: com.ibm.cuda.CudaDevice
813
* Method: getTotalMemory
814
* Signature: (I)J
815
*
816
* @param[in] env the JNI interface pointer
817
* @param[in] (unused) the class pointer
818
* @param[in] deviceId the device identifier
819
* @return the number of bytes of memory on the device
820
*/
821
jlong JNICALL
822
Java_com_ibm_cuda_CudaDevice_getTotalMemory
823
(JNIEnv * env, jclass, jint deviceId)
824
{
825
J9VMThread * thread = (J9VMThread *)env;
826
827
Trc_cuda_deviceGetTotalMemory_entry(thread, deviceId);
828
829
uintptr_t totalBytes = 0;
830
int32_t error = J9CUDA_ERROR_NO_DEVICE;
831
#ifdef OMR_OPT_CUDA
832
PORT_ACCESS_FROM_ENV(env);
833
uintptr_t freeBytes = 0;
834
error = j9cuda_deviceGetMemInfo((uint32_t)deviceId, &freeBytes, &totalBytes);
835
#endif /* OMR_OPT_CUDA */
836
837
if (0 != error) {
838
throwCudaException(env, error);
839
}
840
841
Trc_cuda_deviceGetTotalMemory_exit(thread, totalBytes);
842
843
return (jlong)totalBytes;
844
}
845
846
/**
847
* Adjust the cache configuration of a device.
848
*
849
* Class: com.ibm.cuda.CudaDevice
850
* Method: setCacheConfig
851
* Signature: (II)V
852
*
853
* @param[in] env the JNI interface pointer
854
* @param[in] (unused) the class pointer
855
* @param[in] deviceId the device identifier
856
* @param[in] config the requested cache configuration
857
*/
858
void JNICALL
859
Java_com_ibm_cuda_CudaDevice_setCacheConfig
860
(JNIEnv * env, jclass, jint deviceId, jint config)
861
{
862
J9VMThread * thread = (J9VMThread *)env;
863
864
Trc_cuda_deviceSetCacheConfig_entry(thread, deviceId, config);
865
866
int32_t error = J9CUDA_ERROR_NO_DEVICE;
867
#ifdef OMR_OPT_CUDA
868
PORT_ACCESS_FROM_ENV(env);
869
error = j9cuda_deviceSetCacheConfig((uint32_t)deviceId, (J9CudaCacheConfig)config);
870
#endif /* OMR_OPT_CUDA */
871
872
if (0 != error) {
873
throwCudaException(env, error);
874
}
875
876
Trc_cuda_deviceSetCacheConfig_exit(thread);
877
}
878
879
/**
880
* Set a device limit.
881
*
882
* Class: com.ibm.cuda.CudaDevice
883
* Method: setLimit
884
* Signature: (IIJ)V
885
*
886
* @param[in] env the JNI interface pointer
887
* @param[in] (unused) the class pointer
888
* @param[in] deviceId the device identifier
889
* @param[in] limit the limit to be adjusted
890
* @param[in] value the new value of the limit
891
*/
892
void JNICALL
893
Java_com_ibm_cuda_CudaDevice_setLimit
894
(JNIEnv * env, jclass, jint deviceId, jint limit, jlong value)
895
{
896
J9VMThread * thread = (J9VMThread *)env;
897
898
Trc_cuda_deviceSetLimit_entry(thread, deviceId, limit, value);
899
900
int32_t error = J9CUDA_ERROR_NO_DEVICE;
901
#ifdef OMR_OPT_CUDA
902
PORT_ACCESS_FROM_ENV(env);
903
error = j9cuda_deviceSetLimit(
904
(uint32_t)deviceId,
905
(J9CudaDeviceLimit)limit,
906
(uintptr_t)value);
907
#endif /* OMR_OPT_CUDA */
908
909
if (0 != error) {
910
throwCudaException(env, error);
911
}
912
913
Trc_cuda_deviceSetLimit_exit(thread);
914
}
915
916
/**
917
* Set the shared memory configuration of a device.
918
*
919
* Class: com.ibm.cuda.CudaDevice
920
* Method: setSharedMemConfig
921
* Signature: (II)V
922
*
923
* @param[in] env the JNI interface pointer
924
* @param[in] (unused) the class pointer
925
* @param[in] deviceId the device identifier
926
* @param[in] config the requested shared memory configuration
927
*/
928
void JNICALL
929
Java_com_ibm_cuda_CudaDevice_setSharedMemConfig
930
(JNIEnv * env, jclass, jint deviceId, jint config)
931
{
932
J9VMThread * thread = (J9VMThread *)env;
933
934
Trc_cuda_deviceSetSharedMemConfig_entry(thread, deviceId, config);
935
936
int32_t error = J9CUDA_ERROR_NO_DEVICE;
937
#ifdef OMR_OPT_CUDA
938
PORT_ACCESS_FROM_ENV(env);
939
error = j9cuda_deviceSetSharedMemConfig((uint32_t)deviceId, (J9CudaSharedMemConfig)config);
940
#endif /* OMR_OPT_CUDA */
941
942
if (0 != error) {
943
throwCudaException(env, error);
944
}
945
946
Trc_cuda_deviceSetSharedMemConfig_exit(thread);
947
}
948
949
/**
950
* Synchronize with a device.
951
*
952
* Class: com.ibm.cuda.CudaDevice
953
* Method: synchronize
954
* Signature: (I)V
955
*
956
* @param[in] env the JNI interface pointer
957
* @param[in] (unused) the class pointer
958
* @param[in] deviceId the device identifier
959
*/
960
void JNICALL
961
Java_com_ibm_cuda_CudaDevice_synchronize
962
(JNIEnv * env, jclass, jint deviceId)
963
{
964
J9VMThread * thread = (J9VMThread *)env;
965
966
Trc_cuda_deviceSynchronize_entry(thread, deviceId);
967
968
int32_t error = J9CUDA_ERROR_NO_DEVICE;
969
#ifdef OMR_OPT_CUDA
970
PORT_ACCESS_FROM_ENV(env);
971
error = j9cuda_deviceSynchronize((uint32_t)deviceId);
972
#endif /* OMR_OPT_CUDA */
973
974
if (0 != error) {
975
throwCudaException(env, error);
976
}
977
978
Trc_cuda_deviceSynchronize_exit(thread);
979
}
980
981