Path: blob/master/runtime/cuda/CudaDevice.cpp
12409 views
/*******************************************************************************1* Copyright (c) 2013, 2016 IBM Corp. and others2*3* This program and the accompanying materials are made available under4* the terms of the Eclipse Public License 2.0 which accompanies this5* distribution and is available at https://www.eclipse.org/legal/epl-2.0/6* or the Apache License, Version 2.0 which accompanies this distribution and7* is available at https://www.apache.org/licenses/LICENSE-2.0.8*9* This Source Code may also be made available under the following10* Secondary Licenses when the conditions for such availability set11* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU12* General Public License, version 2 with the GNU Classpath13* Exception [1] and GNU General Public License, version 2 with the14* OpenJDK Assembly Exception [2].15*16* [1] https://www.gnu.org/software/classpath/license.html17* [2] http://openjdk.java.net/legal/assembly-exception.html18*19* 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-exception20*******************************************************************************/2122#include "CudaCommon.hpp"23#include "java/com_ibm_cuda_CudaDevice.h"2425#ifdef OMR_OPT_CUDA2627namespace28{2930/**31* Instances of this class convey the necessary information to trigger a callback32* to a Java Runnable object.33*/34class Callback {35private:36static char threadName[];37static JavaVMAttachArgs vmAttachArgs;3839JavaVM * jvm;40jobject runnable;4142static void43handler(J9CudaStream stream, int32_t error, uintptr_t data)44{45Trc_cuda_deviceCallbackHandler_entry(stream, error, data);4647Callback * callback = (Callback *)data;48JNIEnv * env = NULL;49jint status = callback->jvm->AttachCurrentThreadAsDaemon((void **)&env, &vmAttachArgs);5051if (JNI_OK != status) {52Trc_cuda_deviceCallbackHandler_exitFail(status);53} else {54J9VMThread * thread = (J9VMThread *)env;55J9CudaGlobals * globals = thread->javaVM->cudaGlobals;5657Assert_cuda_true(NULL != globals);58Assert_cuda_true(NULL != globals->runnable_run);5960env->CallVoidMethod(callback->runnable, globals->runnable_run);6162jthrowable throwable = env->ExceptionOccurred();6364if (NULL != throwable) {65// This happens on a thread started by the CUDA runtime: there is no66// Java caller to catch this exception but we'll note that it occurred.67Trc_cuda_deviceCallbackHandler_exception(thread, throwable);68env->ExceptionClear();69}7071env->DeleteGlobalRef(callback->runnable);7273PORT_ACCESS_FROM_ENV(env);7475J9CUDA_FREE_MEMORY(callback);7677Trc_cuda_deviceCallbackHandler_exit(thread);78}79}8081public:82VMINLINE static void83insert(JNIEnv * env, jint deviceId, jlong stream, jobject runnable)84{85J9VMThread * thread = (J9VMThread *)env;8687Trc_cuda_deviceCallbackInsert_entry(thread, deviceId, (J9CudaStream)stream, runnable);8889PORT_ACCESS_FROM_ENV(env);9091Callback * callback = (Callback *)J9CUDA_ALLOCATE_MEMORY(sizeof(Callback));92int32_t error = J9CUDA_ERROR_MEMORY_ALLOCATION;9394if (NULL == callback) {95Trc_cuda_deviceCallbackInsert_allocFail(thread);96goto fail;97}9899callback->jvm = (JavaVM *)thread->javaVM;100callback->runnable = env->NewGlobalRef(runnable);101102if (NULL == callback->runnable) {103Trc_cuda_deviceCallbackInsert_globalRefFail(thread);104} else {105error = j9cuda_streamAddCallback(106(uint32_t)deviceId,107(J9CudaStream)stream,108handler,109(uintptr_t)callback);110}111112if (0 != error) {113if (NULL != callback->runnable) {114env->DeleteGlobalRef(callback->runnable);115}116117J9CUDA_FREE_MEMORY(callback);118119fail:120throwCudaException(env, error);121}122123Trc_cuda_deviceCallbackInsert_exit(thread, error);124}125};126127char Callback::threadName[] = "cuda4j-callback";128JavaVMAttachArgs Callback::vmAttachArgs = { JNI_VERSION_1_6, threadName, NULL };129130} // namespace131132#endif /* OMR_OPT_CUDA */133134/**135* Add a callback to a stream or the default stream of a device.136*137* Class: com.ibm.cuda.CudaDevice138* Method: addCallback139* Signature: (IJLjava/lang/Runnable;)V140*141* @param[in] env the JNI interface pointer142* @param[in] (unused) the class pointer143* @param[in] deviceId the device identifier144* @param[in] stream the stream, or null for the default stream145* @param[in] callback the callback object146*/147void JNICALL148Java_com_ibm_cuda_CudaDevice_addCallback149(JNIEnv * env, jclass, jint deviceId, jlong stream, jobject callback)150{151J9VMThread * thread = (J9VMThread *)env;152153#ifdef OMR_OPT_CUDA154Trc_cuda_deviceAddCallback_entry(thread, deviceId, (uintptr_t)stream, (uintptr_t)callback);155156Callback::insert(env, deviceId, stream, callback);157#else /* OMR_OPT_CUDA */158throwCudaException(env, J9CUDA_ERROR_NO_DEVICE);159#endif /* OMR_OPT_CUDA */160161Trc_cuda_deviceAddCallback_exit(thread);162}163164/**165* Query whether a device can access a peer device.166*167* Class: com.ibm.cuda.CudaDevice168* Method: canAccessPeer169* Signature: (II)Z170*171* @param[in] env the JNI interface pointer172* @param[in] (unused) the class pointer173* @param[in] deviceId the device identifier174* @param[in] peerDeviceId the peer device identifier175* @return whether deviceId can access peerDeviceId176*/177jboolean JNICALL178Java_com_ibm_cuda_CudaDevice_canAccessPeer179(JNIEnv * env, jclass, jint deviceId, jint peerDeviceId)180{181J9VMThread * thread = (J9VMThread *)env;182183Trc_cuda_deviceCanAccessPeer_entry(thread, deviceId, peerDeviceId);184185BOOLEAN result = 0;186int32_t error = J9CUDA_ERROR_NO_DEVICE;187#ifdef OMR_OPT_CUDA188PORT_ACCESS_FROM_ENV(env);189error = j9cuda_deviceCanAccessPeer((uint32_t)deviceId, (uint32_t)peerDeviceId, &result);190#endif /* OMR_OPT_CUDA */191192if (0 != error) {193throwCudaException(env, error);194}195196Trc_cuda_deviceCanAccessPeer_exit(thread, 0 != result);197198return (jboolean)(0 != result);199}200201/**202* Disable access to a peer device.203*204* Class: com.ibm.cuda.CudaDevice205* Method: disablePeerAccess206* Signature: (II)V207*208* @param[in] env the JNI interface pointer209* @param[in] (unused) the class pointer210* @param[in] deviceId the device identifier211* @param[in] peerDeviceId the peer device identifier212*/213void JNICALL214Java_com_ibm_cuda_CudaDevice_disablePeerAccess215(JNIEnv * env, jclass, jint deviceId, jint peerDeviceId)216{217J9VMThread * thread = (J9VMThread *)env;218219Trc_cuda_deviceDisablePeerAccess_entry(thread, deviceId, peerDeviceId);220221int32_t error = J9CUDA_ERROR_NO_DEVICE;222#ifdef OMR_OPT_CUDA223PORT_ACCESS_FROM_ENV(env);224error = j9cuda_deviceDisablePeerAccess((uint32_t)deviceId, (uint32_t)peerDeviceId);225#endif /* OMR_OPT_CUDA */226227if (0 != error) {228throwCudaException(env, error);229}230231Trc_cuda_deviceDisablePeerAccess_exit(thread);232}233234/**235* Enable access to a peer device.236*237* Class: com.ibm.cuda.CudaDevice238* Method: enablePeerAccess239* Signature: (II)V240*241* @param[in] env the JNI interface pointer242* @param[in] (unused) the class pointer243* @param[in] deviceId the device identifier244* @param[in] peerDeviceId the peer device identifier245*/246void JNICALL247Java_com_ibm_cuda_CudaDevice_enablePeerAccess248(JNIEnv * env, jclass, jint deviceId, jint peerDeviceId)249{250J9VMThread * thread = (J9VMThread *)env;251252Trc_cuda_deviceEnablePeerAccess_entry(thread, deviceId, peerDeviceId);253254int32_t error = J9CUDA_ERROR_NO_DEVICE;255#ifdef OMR_OPT_CUDA256PORT_ACCESS_FROM_ENV(env);257error = j9cuda_deviceEnablePeerAccess((uint32_t)deviceId, (uint32_t)peerDeviceId);258#endif /* OMR_OPT_CUDA */259260if (0 != error) {261throwCudaException(env, error);262}263264Trc_cuda_deviceEnablePeerAccess_exit(thread);265}266267/**268* Query a device attribute.269*270* Class: com.ibm.cuda.CudaDevice271* Method: getAttribute272* Signature: (II)I273*274* @param[in] env the JNI interface pointer275* @param[in] (unused) the class pointer276* @param[in] deviceId the device identifier277* @param[in] attribute the attribute to query278* @return the value of the requested attribute279*/280jint JNICALL281Java_com_ibm_cuda_CudaDevice_getAttribute282(JNIEnv * env, jclass, jint deviceId, jint attribute)283{284J9VMThread * thread = (J9VMThread *)env;285286Trc_cuda_deviceGetAttribute_entry(thread, deviceId, attribute);287288int32_t value = 0;289int32_t error = J9CUDA_ERROR_NO_DEVICE;290#ifdef OMR_OPT_CUDA291PORT_ACCESS_FROM_ENV(env);292error = J9CUDA_ERROR_INVALID_VALUE;293J9CudaDeviceAttribute j9attrib = J9CUDA_DEVICE_ATTRIBUTE_WARP_SIZE;294295switch (attribute) {296default:297goto fail;298case com_ibm_cuda_CudaDevice_ATTRIBUTE_ASYNC_ENGINE_COUNT:299j9attrib = J9CUDA_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT;300break;301case com_ibm_cuda_CudaDevice_ATTRIBUTE_CAN_MAP_HOST_MEMORY:302j9attrib = J9CUDA_DEVICE_ATTRIBUTE_CAN_MAP_HOST_MEMORY;303break;304case com_ibm_cuda_CudaDevice_ATTRIBUTE_CLOCK_RATE:305j9attrib = J9CUDA_DEVICE_ATTRIBUTE_CLOCK_RATE;306break;307case com_ibm_cuda_CudaDevice_ATTRIBUTE_COMPUTE_CAPABILITY:308j9attrib = J9CUDA_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY;309break;310case com_ibm_cuda_CudaDevice_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR:311j9attrib = J9CUDA_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR;312break;313case com_ibm_cuda_CudaDevice_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR:314j9attrib = J9CUDA_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR;315break;316case com_ibm_cuda_CudaDevice_ATTRIBUTE_COMPUTE_MODE:317j9attrib = J9CUDA_DEVICE_ATTRIBUTE_COMPUTE_MODE;318break;319case com_ibm_cuda_CudaDevice_ATTRIBUTE_CONCURRENT_KERNELS:320j9attrib = J9CUDA_DEVICE_ATTRIBUTE_CONCURRENT_KERNELS;321break;322case com_ibm_cuda_CudaDevice_ATTRIBUTE_ECC_ENABLED:323j9attrib = J9CUDA_DEVICE_ATTRIBUTE_ECC_ENABLED;324break;325case com_ibm_cuda_CudaDevice_ATTRIBUTE_GLOBAL_MEMORY_BUS_WIDTH:326j9attrib = J9CUDA_DEVICE_ATTRIBUTE_GLOBAL_MEMORY_BUS_WIDTH;327break;328case com_ibm_cuda_CudaDevice_ATTRIBUTE_INTEGRATED:329j9attrib = J9CUDA_DEVICE_ATTRIBUTE_INTEGRATED;330break;331case com_ibm_cuda_CudaDevice_ATTRIBUTE_KERNEL_EXEC_TIMEOUT:332j9attrib = J9CUDA_DEVICE_ATTRIBUTE_KERNEL_EXEC_TIMEOUT;333break;334case com_ibm_cuda_CudaDevice_ATTRIBUTE_L2_CACHE_SIZE:335j9attrib = J9CUDA_DEVICE_ATTRIBUTE_L2_CACHE_SIZE;336break;337case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_BLOCK_DIM_X:338j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_X;339break;340case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_BLOCK_DIM_Y:341j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Y;342break;343case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_BLOCK_DIM_Z:344j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Z;345break;346case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_GRID_DIM_X:347j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_GRID_DIM_X;348break;349case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_GRID_DIM_Y:350j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Y;351break;352case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_GRID_DIM_Z:353j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Z;354break;355case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_LAYERS:356j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_LAYERS;357break;358case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_WIDTH:359j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_WIDTH;360break;361case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE1D_WIDTH:362j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_WIDTH;363break;364case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE2D_HEIGHT:365j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_HEIGHT;366break;367case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_HEIGHT:368j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_HEIGHT;369break;370case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_LAYERS:371j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_LAYERS;372break;373case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_WIDTH:374j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_WIDTH;375break;376case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE2D_WIDTH:377j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_WIDTH;378break;379case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE3D_DEPTH:380j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_DEPTH;381break;382case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE3D_HEIGHT:383j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_HEIGHT;384break;385case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACE3D_WIDTH:386j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_WIDTH;387break;388case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_LAYERS:389j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_LAYERS;390break;391case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_WIDTH:392j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_WIDTH;393break;394case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_WIDTH:395j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_WIDTH;396break;397case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_LAYERS:398j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_LAYERS;399break;400case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_WIDTH:401j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_WIDTH;402break;403case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE1D_LINEAR_WIDTH:404j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LINEAR_WIDTH;405break;406case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE1D_MIPMAPPED_WIDTH:407j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_MIPMAPPED_WIDTH;408break;409case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE1D_WIDTH:410j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_WIDTH;411break;412case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_HEIGHT:413j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_HEIGHT;414break;415case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_WIDTH:416j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_WIDTH;417break;418case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_HEIGHT:419j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_HEIGHT;420break;421case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_HEIGHT:422j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_HEIGHT;423break;424case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_LAYERS:425j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_LAYERS;426break;427case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_WIDTH:428j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_WIDTH;429break;430case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_HEIGHT:431j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_HEIGHT;432break;433case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_PITCH:434j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_PITCH;435break;436case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_WIDTH:437j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_WIDTH;438break;439case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_HEIGHT:440j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_HEIGHT;441break;442case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_WIDTH:443j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_WIDTH;444break;445case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE2D_WIDTH:446j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_WIDTH;447break;448case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH:449j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH;450break;451case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH_ALTERNATE:452j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH_ALTERNATE;453break;454case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT:455j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT;456break;457case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT_ALTERNATE:458j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT_ALTERNATE;459break;460case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH:461j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH;462break;463case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH_ALTERNATE:464j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH_ALTERNATE;465break;466case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_LAYERS:467j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_LAYERS;468break;469case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_WIDTH:470j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_WIDTH;471break;472case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_WIDTH:473j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_WIDTH;474break;475case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_PITCH:476j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_PITCH;477break;478case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_REGISTERS_PER_BLOCK:479j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_BLOCK;480break;481case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK:482j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK;483break;484case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_THREADS_PER_BLOCK:485j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_THREADS_PER_BLOCK;486break;487case com_ibm_cuda_CudaDevice_ATTRIBUTE_MAX_THREADS_PER_MULTIPROCESSOR:488j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MAX_THREADS_PER_MULTIPROCESSOR;489break;490case com_ibm_cuda_CudaDevice_ATTRIBUTE_MEMORY_CLOCK_RATE:491j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MEMORY_CLOCK_RATE;492break;493case com_ibm_cuda_CudaDevice_ATTRIBUTE_MULTIPROCESSOR_COUNT:494j9attrib = J9CUDA_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT;495break;496case com_ibm_cuda_CudaDevice_ATTRIBUTE_PCI_BUS_ID:497j9attrib = J9CUDA_DEVICE_ATTRIBUTE_PCI_BUS_ID;498break;499case com_ibm_cuda_CudaDevice_ATTRIBUTE_PCI_DEVICE_ID:500j9attrib = J9CUDA_DEVICE_ATTRIBUTE_PCI_DEVICE_ID;501break;502case com_ibm_cuda_CudaDevice_ATTRIBUTE_PCI_DOMAIN_ID:503j9attrib = J9CUDA_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID;504break;505case com_ibm_cuda_CudaDevice_ATTRIBUTE_STREAM_PRIORITIES_SUPPORTED:506j9attrib = J9CUDA_DEVICE_ATTRIBUTE_STREAM_PRIORITIES_SUPPORTED;507break;508case com_ibm_cuda_CudaDevice_ATTRIBUTE_SURFACE_ALIGNMENT:509j9attrib = J9CUDA_DEVICE_ATTRIBUTE_SURFACE_ALIGNMENT;510break;511case com_ibm_cuda_CudaDevice_ATTRIBUTE_TCC_DRIVER:512j9attrib = J9CUDA_DEVICE_ATTRIBUTE_TCC_DRIVER;513break;514case com_ibm_cuda_CudaDevice_ATTRIBUTE_TEXTURE_ALIGNMENT:515j9attrib = J9CUDA_DEVICE_ATTRIBUTE_TEXTURE_ALIGNMENT;516break;517case com_ibm_cuda_CudaDevice_ATTRIBUTE_TEXTURE_PITCH_ALIGNMENT:518j9attrib = J9CUDA_DEVICE_ATTRIBUTE_TEXTURE_PITCH_ALIGNMENT;519break;520case com_ibm_cuda_CudaDevice_ATTRIBUTE_TOTAL_CONSTANT_MEMORY:521j9attrib = J9CUDA_DEVICE_ATTRIBUTE_TOTAL_CONSTANT_MEMORY;522break;523case com_ibm_cuda_CudaDevice_ATTRIBUTE_UNIFIED_ADDRESSING:524j9attrib = J9CUDA_DEVICE_ATTRIBUTE_UNIFIED_ADDRESSING;525break;526case com_ibm_cuda_CudaDevice_ATTRIBUTE_WARP_SIZE:527j9attrib = J9CUDA_DEVICE_ATTRIBUTE_WARP_SIZE;528break;529}530531error = j9cuda_deviceGetAttribute((uint32_t)deviceId, j9attrib, &value);532#endif /* OMR_OPT_CUDA */533534if (0 != error) {535#ifdef OMR_OPT_CUDA536fail:537#endif /* OMR_OPT_CUDA */538throwCudaException(env, error);539}540541Trc_cuda_deviceGetAttribute_exit(thread, value);542543return (jint)value;544}545546/**547* Query the cache configuration of a device.548*549* Class: com.ibm.cuda.CudaDevice550* Method: getCacheConfig551* Signature: (I)I552*553* @param[in] env the JNI interface pointer554* @param[in] (unused) the class pointer555* @param[in] deviceId the device identifier556* @return the device cache configuration557*/558jint JNICALL559Java_com_ibm_cuda_CudaDevice_getCacheConfig560(JNIEnv * env, jclass, jint deviceId)561{562J9VMThread * thread = (J9VMThread *)env;563564Trc_cuda_deviceGetCacheConfig_entry(thread, deviceId);565566J9CudaCacheConfig config = J9CUDA_CACHE_CONFIG_PREFER_EQUAL;567int32_t error = J9CUDA_ERROR_NO_DEVICE;568#ifdef OMR_OPT_CUDA569PORT_ACCESS_FROM_ENV(env);570error = j9cuda_deviceGetCacheConfig((uint32_t)deviceId, &config);571#endif /* OMR_OPT_CUDA */572573if (0 != error) {574throwCudaException(env, error);575}576577Trc_cuda_deviceGetCacheConfig_exit(thread, config);578579return (jint)config;580}581582/**583* Query the amount of free memory on a device.584*585* Class: com.ibm.cuda.CudaDevice586* Method: getFreeMemory587* Signature: (I)J588*589* @param[in] env the JNI interface pointer590* @param[in] (unused) the class pointer591* @param[in] deviceId the device identifier592* @return the number of bytes of free memory on the device593*/594jlong JNICALL595Java_com_ibm_cuda_CudaDevice_getFreeMemory596(JNIEnv * env, jclass, jint deviceId)597{598J9VMThread * thread = (J9VMThread *)env;599600Trc_cuda_deviceGetFreeMemory_entry(thread, deviceId);601602uintptr_t freeBytes = 0;603int32_t error = J9CUDA_ERROR_NO_DEVICE;604#ifdef OMR_OPT_CUDA605PORT_ACCESS_FROM_ENV(env);606uintptr_t totalBytes = 0;607error = j9cuda_deviceGetMemInfo((uint32_t)deviceId, &freeBytes, &totalBytes);608#endif /* OMR_OPT_CUDA */609610if (0 != error) {611throwCudaException(env, error);612}613614Trc_cuda_deviceGetFreeMemory_exit(thread, freeBytes);615616return (jlong)freeBytes;617}618619/**620* Return the greatest stream priority for a device.621*622* Class: com.ibm.cuda.CudaDevice623* Method: getGreatestStreamPriority624* Signature: (I)I625*626* @param[in] env the JNI interface pointer627* @param[in] (unused) the class pointer628* @param[in] deviceId the device identifier629* @return the greatest stream priority630*/631jint JNICALL632Java_com_ibm_cuda_CudaDevice_getGreatestStreamPriority633(JNIEnv * env, jclass, jint deviceId)634{635J9VMThread * thread = (J9VMThread *)env;636637Trc_cuda_deviceGetGreatestStreamPriority_entry(thread, deviceId);638639int32_t greatestPriority = 0;640int32_t error = J9CUDA_ERROR_NO_DEVICE;641#ifdef OMR_OPT_CUDA642PORT_ACCESS_FROM_ENV(env);643int32_t leastPriority = 0;644error = j9cuda_deviceGetStreamPriorityRange((uint32_t)deviceId, &leastPriority, &greatestPriority);645#endif /* OMR_OPT_CUDA */646647if (0 != error) {648throwCudaException(env, error);649}650651Trc_cuda_deviceGetGreatestStreamPriority_exit(thread, greatestPriority);652653return (jint)greatestPriority;654}655656/**657* Return the least stream priority for a device.658*659* Class: com.ibm.cuda.CudaDevice660* Method: getLeastStreamPriority661* Signature: (I)I662*663* @param[in] env the JNI interface pointer664* @param[in] (unused) the class pointer665* @param[in] deviceId the device identifier666* @return the least stream priority667*/668jint JNICALL669Java_com_ibm_cuda_CudaDevice_getLeastStreamPriority670(JNIEnv * env, jclass, jint deviceId)671{672J9VMThread * thread = (J9VMThread *)env;673674Trc_cuda_deviceGetLeastStreamPriority_entry(thread, deviceId);675676int32_t leastPriority = 0;677int32_t error = J9CUDA_ERROR_NO_DEVICE;678#ifdef OMR_OPT_CUDA679PORT_ACCESS_FROM_ENV(env);680int32_t greatestPriority = 0;681error = j9cuda_deviceGetStreamPriorityRange((uint32_t)deviceId, &leastPriority, &greatestPriority);682#endif /* OMR_OPT_CUDA */683684if (0 != error) {685throwCudaException(env, error);686}687688Trc_cuda_deviceGetLeastStreamPriority_exit(thread, leastPriority);689690return (jint)leastPriority;691}692693/**694* Query a limit of a device.695*696* Class: com.ibm.cuda.CudaDevice697* Method: getLimit698* Signature: (II)J699*700* @param[in] env the JNI interface pointer701* @param[in] (unused) the class pointer702* @param[in] deviceId the device identifier703* @param[in] limit the requested limit704* @return the value of the requested limit705*/706jlong JNICALL707Java_com_ibm_cuda_CudaDevice_getLimit708(JNIEnv * env, jclass, jint deviceId, jint limit)709{710J9VMThread * thread = (J9VMThread *)env;711712Trc_cuda_deviceGetLimit_entry(thread, deviceId, limit);713714uintptr_t value = 0;715int32_t error = J9CUDA_ERROR_NO_DEVICE;716#ifdef OMR_OPT_CUDA717PORT_ACCESS_FROM_ENV(env);718error = j9cuda_deviceGetLimit((uint32_t)deviceId, (J9CudaDeviceLimit)limit, &value);719#endif /* OMR_OPT_CUDA */720721if (0 != error) {722throwCudaException(env, error);723}724725Trc_cuda_deviceGetLimit_exit(thread, value);726727return (jlong)value;728}729730/**731* Query the name of a device.732*733* Class: com.ibm.cuda.CudaDevice734* Method: getName735* Signature: (I)Ljava/lang/String;736*737* @param[in] env the JNI interface pointer738* @param[in] (unused) the class pointer739* @param[in] deviceId the device identifier740* @return the name of the device741*/742jstring JNICALL743Java_com_ibm_cuda_CudaDevice_getName744(JNIEnv * env, jclass, jint deviceId)745{746J9VMThread * thread = (J9VMThread *)env;747748Trc_cuda_deviceGetName_entry(thread, deviceId);749750jstring result = NULL;751char name[256];752753name[0] = 0;754755int32_t error = J9CUDA_ERROR_NO_DEVICE;756#ifdef OMR_OPT_CUDA757PORT_ACCESS_FROM_ENV(env);758error = j9cuda_deviceGetName((uint32_t)deviceId, (uint32_t)sizeof(name), name);759#endif /* OMR_OPT_CUDA */760761if (0 != error) {762throwCudaException(env, error);763} else {764result = env->NewStringUTF(name);765}766767Trc_cuda_deviceGetName_exit(thread, result, name);768769return result;770}771772/**773* Query the shared memory configuration of a device.774*775* Class: com.ibm.cuda.CudaDevice776* Method: getSharedMemConfig777* Signature: (I)I778*779* @param[in] env the JNI interface pointer780* @param[in] (unused) the class pointer781* @param[in] deviceId the device identifier782* @return the shared memory configuration783*/784jint JNICALL785Java_com_ibm_cuda_CudaDevice_getSharedMemConfig786(JNIEnv * env, jclass, jint deviceId)787{788J9VMThread * thread = (J9VMThread *)env;789790Trc_cuda_deviceGetSharedMemConfig_entry(thread, deviceId);791792J9CudaSharedMemConfig config = J9CUDA_SHARED_MEM_CONFIG_DEFAULT_BANK_SIZE;793int32_t error = J9CUDA_ERROR_NO_DEVICE;794#ifdef OMR_OPT_CUDA795PORT_ACCESS_FROM_ENV(env);796error = j9cuda_deviceGetSharedMemConfig((uint32_t)deviceId, &config);797#endif /* OMR_OPT_CUDA */798799if (0 != error) {800throwCudaException(env, error);801}802803Trc_cuda_deviceGetSharedMemConfig_exit(thread, config);804805return (jint)config;806}807808/**809* Query the total amount of memory on a device.810*811* Class: com.ibm.cuda.CudaDevice812* Method: getTotalMemory813* Signature: (I)J814*815* @param[in] env the JNI interface pointer816* @param[in] (unused) the class pointer817* @param[in] deviceId the device identifier818* @return the number of bytes of memory on the device819*/820jlong JNICALL821Java_com_ibm_cuda_CudaDevice_getTotalMemory822(JNIEnv * env, jclass, jint deviceId)823{824J9VMThread * thread = (J9VMThread *)env;825826Trc_cuda_deviceGetTotalMemory_entry(thread, deviceId);827828uintptr_t totalBytes = 0;829int32_t error = J9CUDA_ERROR_NO_DEVICE;830#ifdef OMR_OPT_CUDA831PORT_ACCESS_FROM_ENV(env);832uintptr_t freeBytes = 0;833error = j9cuda_deviceGetMemInfo((uint32_t)deviceId, &freeBytes, &totalBytes);834#endif /* OMR_OPT_CUDA */835836if (0 != error) {837throwCudaException(env, error);838}839840Trc_cuda_deviceGetTotalMemory_exit(thread, totalBytes);841842return (jlong)totalBytes;843}844845/**846* Adjust the cache configuration of a device.847*848* Class: com.ibm.cuda.CudaDevice849* Method: setCacheConfig850* Signature: (II)V851*852* @param[in] env the JNI interface pointer853* @param[in] (unused) the class pointer854* @param[in] deviceId the device identifier855* @param[in] config the requested cache configuration856*/857void JNICALL858Java_com_ibm_cuda_CudaDevice_setCacheConfig859(JNIEnv * env, jclass, jint deviceId, jint config)860{861J9VMThread * thread = (J9VMThread *)env;862863Trc_cuda_deviceSetCacheConfig_entry(thread, deviceId, config);864865int32_t error = J9CUDA_ERROR_NO_DEVICE;866#ifdef OMR_OPT_CUDA867PORT_ACCESS_FROM_ENV(env);868error = j9cuda_deviceSetCacheConfig((uint32_t)deviceId, (J9CudaCacheConfig)config);869#endif /* OMR_OPT_CUDA */870871if (0 != error) {872throwCudaException(env, error);873}874875Trc_cuda_deviceSetCacheConfig_exit(thread);876}877878/**879* Set a device limit.880*881* Class: com.ibm.cuda.CudaDevice882* Method: setLimit883* Signature: (IIJ)V884*885* @param[in] env the JNI interface pointer886* @param[in] (unused) the class pointer887* @param[in] deviceId the device identifier888* @param[in] limit the limit to be adjusted889* @param[in] value the new value of the limit890*/891void JNICALL892Java_com_ibm_cuda_CudaDevice_setLimit893(JNIEnv * env, jclass, jint deviceId, jint limit, jlong value)894{895J9VMThread * thread = (J9VMThread *)env;896897Trc_cuda_deviceSetLimit_entry(thread, deviceId, limit, value);898899int32_t error = J9CUDA_ERROR_NO_DEVICE;900#ifdef OMR_OPT_CUDA901PORT_ACCESS_FROM_ENV(env);902error = j9cuda_deviceSetLimit(903(uint32_t)deviceId,904(J9CudaDeviceLimit)limit,905(uintptr_t)value);906#endif /* OMR_OPT_CUDA */907908if (0 != error) {909throwCudaException(env, error);910}911912Trc_cuda_deviceSetLimit_exit(thread);913}914915/**916* Set the shared memory configuration of a device.917*918* Class: com.ibm.cuda.CudaDevice919* Method: setSharedMemConfig920* Signature: (II)V921*922* @param[in] env the JNI interface pointer923* @param[in] (unused) the class pointer924* @param[in] deviceId the device identifier925* @param[in] config the requested shared memory configuration926*/927void JNICALL928Java_com_ibm_cuda_CudaDevice_setSharedMemConfig929(JNIEnv * env, jclass, jint deviceId, jint config)930{931J9VMThread * thread = (J9VMThread *)env;932933Trc_cuda_deviceSetSharedMemConfig_entry(thread, deviceId, config);934935int32_t error = J9CUDA_ERROR_NO_DEVICE;936#ifdef OMR_OPT_CUDA937PORT_ACCESS_FROM_ENV(env);938error = j9cuda_deviceSetSharedMemConfig((uint32_t)deviceId, (J9CudaSharedMemConfig)config);939#endif /* OMR_OPT_CUDA */940941if (0 != error) {942throwCudaException(env, error);943}944945Trc_cuda_deviceSetSharedMemConfig_exit(thread);946}947948/**949* Synchronize with a device.950*951* Class: com.ibm.cuda.CudaDevice952* Method: synchronize953* Signature: (I)V954*955* @param[in] env the JNI interface pointer956* @param[in] (unused) the class pointer957* @param[in] deviceId the device identifier958*/959void JNICALL960Java_com_ibm_cuda_CudaDevice_synchronize961(JNIEnv * env, jclass, jint deviceId)962{963J9VMThread * thread = (J9VMThread *)env;964965Trc_cuda_deviceSynchronize_entry(thread, deviceId);966967int32_t error = J9CUDA_ERROR_NO_DEVICE;968#ifdef OMR_OPT_CUDA969PORT_ACCESS_FROM_ENV(env);970error = j9cuda_deviceSynchronize((uint32_t)deviceId);971#endif /* OMR_OPT_CUDA */972973if (0 != error) {974throwCudaException(env, error);975}976977Trc_cuda_deviceSynchronize_exit(thread);978}979980981