1 /* CUDA Driver API description. 2 Copyright (C) 2017-2022 Free Software Foundation, Inc. 3 4 This file is part of GCC. 5 6 GCC is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3, or (at your option) 9 any later version. 10 11 GCC is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 Under Section 7 of GPL version 3, you are granted additional 17 permissions described in the GCC Runtime Library Exception, version 18 3.1, as published by the Free Software Foundation. 19 20 You should have received a copy of the GNU General Public License and 21 a copy of the GCC Runtime Library Exception along with this program; 22 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 <http://www.gnu.org/licenses/>. 24 25 This header provides parts of the CUDA Driver API, without having to rely on 26 the proprietary CUDA toolkit. */ 27 28 #ifndef GCC_CUDA_H 29 #define GCC_CUDA_H 30 31 #include <stdlib.h> 32 33 #define CUDA_VERSION 8000 34 35 typedef void *CUcontext; 36 typedef int CUdevice; 37 #if defined(__LP64__) || defined(_WIN64) 38 typedef unsigned long long CUdeviceptr; 39 #else 40 typedef unsigned CUdeviceptr; 41 #endif 42 typedef void *CUevent; 43 typedef void *CUfunction; 44 typedef void *CUlinkState; 45 typedef void *CUmodule; 46 typedef size_t (*CUoccupancyB2DSize)(int); 47 typedef void *CUstream; 48 49 typedef enum { 50 CUDA_SUCCESS = 0, 51 CUDA_ERROR_INVALID_VALUE = 1, 52 CUDA_ERROR_OUT_OF_MEMORY = 2, 53 CUDA_ERROR_INVALID_CONTEXT = 201, 54 CUDA_ERROR_NOT_FOUND = 500, 55 CUDA_ERROR_NOT_READY = 600, 56 CUDA_ERROR_LAUNCH_FAILED = 719, 57 CUDA_ERROR_COOPERATIVE_LAUNCH_TOO_LARGE = 720, 58 CUDA_ERROR_NOT_PERMITTED = 800, 59 CUDA_ERROR_NOT_SUPPORTED = 801, 60 CUDA_ERROR_UNKNOWN = 999 61 } CUresult; 62 63 typedef enum { 64 CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_BLOCK = 1, 65 CU_DEVICE_ATTRIBUTE_WARP_SIZE = 10, 66 CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_BLOCK = 12, 67 CU_DEVICE_ATTRIBUTE_CLOCK_RATE = 13, 68 CU_DEVICE_ATTRIBUTE_GPU_OVERLAP = 15, 69 CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT = 16, 70 CU_DEVICE_ATTRIBUTE_INTEGRATED = 18, 71 CU_DEVICE_ATTRIBUTE_CAN_MAP_HOST_MEMORY = 19, 72 CU_DEVICE_ATTRIBUTE_COMPUTE_MODE = 20, 73 CU_DEVICE_ATTRIBUTE_CONCURRENT_KERNELS = 31, 74 CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_MULTIPROCESSOR = 39, 75 CU_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT = 40, 76 CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_MULTIPROCESSOR = 82 77 } CUdevice_attribute; 78 79 enum { 80 CU_EVENT_DEFAULT = 0, 81 CU_EVENT_DISABLE_TIMING = 2 82 }; 83 84 typedef enum { 85 CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK = 0, 86 CU_FUNC_ATTRIBUTE_NUM_REGS = 4 87 } CUfunction_attribute; 88 89 typedef enum { 90 CU_JIT_WALL_TIME = 2, 91 CU_JIT_INFO_LOG_BUFFER = 3, 92 CU_JIT_INFO_LOG_BUFFER_SIZE_BYTES = 4, 93 CU_JIT_ERROR_LOG_BUFFER = 5, 94 CU_JIT_ERROR_LOG_BUFFER_SIZE_BYTES = 6, 95 CU_JIT_OPTIMIZATION_LEVEL = 7, 96 CU_JIT_LOG_VERBOSE = 12 97 } CUjit_option; 98 99 typedef enum { 100 CU_JIT_INPUT_PTX = 1 101 } CUjitInputType; 102 103 enum { 104 CU_CTX_SCHED_AUTO = 0 105 }; 106 107 #define CU_LAUNCH_PARAM_END ((void *) 0) 108 #define CU_LAUNCH_PARAM_BUFFER_POINTER ((void *) 1) 109 #define CU_LAUNCH_PARAM_BUFFER_SIZE ((void *) 2) 110 111 enum { 112 CU_STREAM_DEFAULT = 0, 113 CU_STREAM_NON_BLOCKING = 1 114 }; 115 116 #define cuCtxCreate cuCtxCreate_v2 117 CUresult cuCtxCreate (CUcontext *, unsigned, CUdevice); 118 #define cuCtxDestroy cuCtxDestroy_v2 119 CUresult cuCtxDestroy (CUcontext); 120 CUresult cuCtxGetCurrent (CUcontext *); 121 CUresult cuCtxGetDevice (CUdevice *); 122 #define cuCtxPopCurrent cuCtxPopCurrent_v2 123 CUresult cuCtxPopCurrent (CUcontext *); 124 #define cuCtxPushCurrent cuCtxPushCurrent_v2 125 CUresult cuCtxPushCurrent (CUcontext); 126 CUresult cuCtxSynchronize (void); 127 CUresult cuDeviceGet (CUdevice *, int); 128 #define cuDeviceTotalMem cuDeviceTotalMem_v2 129 CUresult cuDeviceTotalMem (size_t *, CUdevice); 130 CUresult cuDeviceGetAttribute (int *, CUdevice_attribute, CUdevice); 131 CUresult cuDeviceGetCount (int *); 132 CUresult cuDeviceGetName (char *, int, CUdevice); 133 CUresult cuEventCreate (CUevent *, unsigned); 134 #define cuEventDestroy cuEventDestroy_v2 135 CUresult cuEventDestroy (CUevent); 136 CUresult cuEventElapsedTime (float *, CUevent, CUevent); 137 CUresult cuEventQuery (CUevent); 138 CUresult cuEventRecord (CUevent, CUstream); 139 CUresult cuEventSynchronize (CUevent); 140 CUresult cuFuncGetAttribute (int *, CUfunction_attribute, CUfunction); 141 CUresult cuGetErrorString (CUresult, const char **); 142 CUresult cuInit (unsigned); 143 CUresult cuDriverGetVersion (int *); 144 CUresult cuLaunchKernel (CUfunction, unsigned, unsigned, unsigned, unsigned, 145 unsigned, unsigned, unsigned, CUstream, void **, void **); 146 #define cuLinkAddData cuLinkAddData_v2 147 CUresult cuLinkAddData (CUlinkState, CUjitInputType, void *, size_t, const char *, 148 unsigned, CUjit_option *, void **); 149 CUresult cuLinkComplete (CUlinkState, void **, size_t *); 150 #define cuLinkCreate cuLinkCreate_v2 151 CUresult cuLinkCreate (unsigned, CUjit_option *, void **, CUlinkState *); 152 CUresult cuLinkDestroy (CUlinkState); 153 #define cuMemGetInfo cuMemGetInfo_v2 154 CUresult cuMemGetInfo (size_t *, size_t *); 155 #define cuMemAlloc cuMemAlloc_v2 156 CUresult cuMemAlloc (CUdeviceptr *, size_t); 157 #define cuMemAllocHost cuMemAllocHost_v2 158 CUresult cuMemAllocHost (void **, size_t); 159 CUresult cuMemcpy (CUdeviceptr, CUdeviceptr, size_t); 160 #define cuMemcpyDtoDAsync cuMemcpyDtoDAsync_v2 161 CUresult cuMemcpyDtoDAsync (CUdeviceptr, CUdeviceptr, size_t, CUstream); 162 #define cuMemcpyDtoH cuMemcpyDtoH_v2 163 CUresult cuMemcpyDtoH (void *, CUdeviceptr, size_t); 164 #define cuMemcpyDtoHAsync cuMemcpyDtoHAsync_v2 165 CUresult cuMemcpyDtoHAsync (void *, CUdeviceptr, size_t, CUstream); 166 #define cuMemcpyHtoD cuMemcpyHtoD_v2 167 CUresult cuMemcpyHtoD (CUdeviceptr, const void *, size_t); 168 #define cuMemcpyHtoDAsync cuMemcpyHtoDAsync_v2 169 CUresult cuMemcpyHtoDAsync (CUdeviceptr, const void *, size_t, CUstream); 170 #define cuMemFree cuMemFree_v2 171 CUresult cuMemFree (CUdeviceptr); 172 CUresult cuMemFreeHost (void *); 173 #define cuMemGetAddressRange cuMemGetAddressRange_v2 174 CUresult cuMemGetAddressRange (CUdeviceptr *, size_t *, CUdeviceptr); 175 #define cuMemHostGetDevicePointer cuMemHostGetDevicePointer_v2 176 CUresult cuMemHostGetDevicePointer (CUdeviceptr *, void *, unsigned); 177 CUresult cuModuleGetFunction (CUfunction *, CUmodule, const char *); 178 #define cuModuleGetGlobal cuModuleGetGlobal_v2 179 CUresult cuModuleGetGlobal (CUdeviceptr *, size_t *, CUmodule, const char *); 180 CUresult cuModuleLoad (CUmodule *, const char *); 181 CUresult cuModuleLoadData (CUmodule *, const void *); 182 CUresult cuModuleUnload (CUmodule); 183 CUresult cuOccupancyMaxPotentialBlockSize(int *, int *, CUfunction, 184 CUoccupancyB2DSize, size_t, int); 185 typedef void (*CUstreamCallback)(CUstream, CUresult, void *); 186 CUresult cuStreamAddCallback(CUstream, CUstreamCallback, void *, unsigned int); 187 CUresult cuStreamCreate (CUstream *, unsigned); 188 #define cuStreamDestroy cuStreamDestroy_v2 189 CUresult cuStreamDestroy (CUstream); 190 CUresult cuStreamQuery (CUstream); 191 CUresult cuStreamSynchronize (CUstream); 192 CUresult cuStreamWaitEvent (CUstream, CUevent, unsigned); 193 194 #endif /* GCC_CUDA_H */ 195