CUDA.Runtime.pas 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783
  1. //
  2. // The graphics engine GLXEngine
  3. //
  4. unit CUDA.Runtime;
  5. (* GLScene CUDA Runtime *)
  6. (*
  7. * Copyright 1993-2020 NVIDIA Corporation. All rights reserved.
  8. *
  9. * NOTICE TO USER:
  10. *
  11. * This source code is subject to NVIDIA ownership rights under U.S. and
  12. * international Copyright laws. Users and possessors of this source code
  13. * are hereby granted a nonexclusive, royalty-free license to use this code
  14. * in individual and commercial software.
  15. *
  16. * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE
  17. * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR
  18. * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH
  19. * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF
  20. * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE.
  21. * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL,
  22. * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
  23. * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  24. * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
  25. * OR PERFORMANCE OF THIS SOURCE CODE.
  26. *
  27. * U.S. Government End Users. This source code is a "commercial item" as
  28. * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of
  29. * "commercial computer software" and "commercial computer software
  30. * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995)
  31. * and is provided to the U.S. Government only as a commercial end item.
  32. * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through
  33. * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the
  34. * source code with only those rights set forth herein.
  35. *
  36. * Any use of this source code in individual and commercial software must
  37. * include, in the user documentation and internal comments to the code,
  38. * the above Disclaimer and U.S. Government End Users Notice.
  39. *)
  40. interface
  41. uses
  42. {$IFDEF MSWINDOWS}
  43. Winapi.Windows,
  44. {$ENDIF}
  45. CUDA.Import;
  46. const
  47. {$IFDEF WIN32}
  48. CUDARTDLLNAMES: array [0 .. 9] of string = (
  49. 'cudart32_42_9', 'cudart32_41_28',
  50. 'cudart32_40_10', 'cudart32_32_16', 'cudart32_31_4',
  51. 'cudart32_30_14', 'cudart32_30_9', 'cudart32_30_8', 'cudart32', 'cudart');
  52. {$ENDIF}
  53. {$IFDEF WIN64}
  54. CUDARTDLLNAMES: array [0 .. 7] of string = (
  55. 'cudart64_42_9', 'cudart64_41_28',
  56. 'cudart64_40_10', 'cudart64_32_16', 'cudart64_31_4',
  57. 'cudart64_30_14', 'cudart64_30_9', 'cudart64_30_8');
  58. {$ENDIF}
  59. const
  60. // single precision constants
  61. CUDART_INF_F: Single = $7F800000;
  62. CUDART_NAN_F: Single = $7FFFFFFF;
  63. CUDART_MIN_DENORM_F: Single = $00000001;
  64. CUDART_MAX_NORMAL_F: Single = $7F7FFFFF;
  65. CUDART_NEG_ZERO_F: Single = $80000000;
  66. CUDART_ZERO_F = 0.0;
  67. CUDART_ONE_F = 1.0;
  68. CUDART_SQRT_HALF_F = 0.707106781;
  69. CUDART_SQRT_TWO_F = 1.414213562;
  70. CUDART_THIRD_F = 0.333333333;
  71. CUDART_PIO4_F = 0.785398163;
  72. CUDART_PIO2_F = 1.570796327;
  73. CUDART_3PIO4_F = 2.356194490;
  74. CUDART_2_OVER_PI_F = 0.636619772;
  75. CUDART_PI_F = 3.141592654;
  76. CUDART_L2E_F = 1.442695041;
  77. CUDART_L2T_F = 3.321928094;
  78. CUDART_LG2_F = 0.301029996;
  79. CUDART_LGE_F = 0.434294482;
  80. CUDART_LN2_F = 0.693147181;
  81. CUDART_LNT_F = 2.302585093;
  82. CUDART_LNPI_F = 1.144729886;
  83. CUDART_TWO_TO_M126_F = 1.175494351E-38;
  84. CUDART_TWO_TO_126_F = 8.507059173E37;
  85. CUDART_NORM_HUGE_F = 3.402823466E38;
  86. CUDART_TWO_TO_23_F = 8388608.0;
  87. CUDART_TWO_TO_24_F = 16777216.0;
  88. CUDART_TWO_TO_31_F = 2147483648.0;
  89. CUDART_TWO_TO_32_F = 4294967296.0;
  90. CUDART_REMQUO_BITS_F = 3;
  91. CUDART_REMQUO_MASK_F = CUDART_REMQUO_BITS_F;
  92. CUDART_TRIG_PLOSS_F = 48039.0;
  93. // double precision constants */
  94. {$IFNDEF CUDA_NO_SM_13_DOUBLE_INTRINSICS}
  95. CUDART_INF: Double = $7FF0000000000000;
  96. CUDART_NAN: Double = $FFF8000000000000;
  97. CUDART_NEG_ZERO: Double = $8000000000000000;
  98. CUDART_MIN_DENORM: Double = $0000000000000001;
  99. {$ELSE} // not CUDA_NO_SM_13_DOUBLE_INTRINSICS
  100. CUDART_INF: Double = $7FF0000000000000;
  101. CUDART_NAN: Double = $FFF8000000000000;
  102. CUDART_NEG_ZERO: Double = $8000000000000000;
  103. CUDART_MIN_DENORM: Double = $0000000000000001;
  104. {$ENDIF}
  105. CUDART_ZERO = 0.0;
  106. CUDART_ONE = 1.0;
  107. CUDART_SQRT_TWO = 1.4142135623730951E+0;
  108. CUDART_SQRT_HALF = 7.0710678118654757E-1;
  109. CUDART_THIRD = 3.3333333333333333E-1;
  110. CUDART_TWOTHIRD = 6.6666666666666667E-1;
  111. CUDART_PIO4 = 7.8539816339744828E-1;
  112. CUDART_PIO4_HI = 7.8539816339744828E-1;
  113. CUDART_PIO4_LO = 3.0616169978683830E-17;
  114. CUDART_PIO2 = 1.5707963267948966E+0;
  115. CUDART_PIO2_HI = 1.5707963267948966E+0;
  116. CUDART_PIO2_LO = 6.1232339957367660E-17;
  117. CUDART_3PIO4 = 2.3561944901923448E+0;
  118. CUDART_2_OVER_PI = 6.3661977236758138E-1;
  119. CUDART_PI = 3.1415926535897931E+0;
  120. CUDART_PI_HI = 3.1415926535897931E+0;
  121. CUDART_PI_LO = 1.2246467991473532E-16;
  122. CUDART_SQRT_2PI_HI = 2.5066282746310007E+0;
  123. CUDART_SQRT_2PI_LO = -1.8328579980459167E-16;
  124. CUDART_SQRT_PIO2_HI = 1.2533141373155003E+0;
  125. CUDART_SQRT_PIO2_LO = -9.1642899902295834E-17;
  126. CUDART_L2E = 1.4426950408889634E+0;
  127. CUDART_L2E_HI = 1.4426950408889634E+0;
  128. CUDART_L2E_LO = 2.0355273740931033E-17;
  129. CUDART_L2T = 3.3219280948873622E+0;
  130. CUDART_LG2 = 3.0102999566398120E-1;
  131. CUDART_LG2_HI = 3.0102999566398120E-1;
  132. CUDART_LG2_LO = -2.8037281277851704E-18;
  133. CUDART_LGE = 4.3429448190325182E-1;
  134. CUDART_LGE_HI = 4.3429448190325182E-1;
  135. CUDART_LGE_LO = 1.09831965021676510E-17;
  136. CUDART_LN2 = 6.9314718055994529E-1;
  137. CUDART_LN2_HI = 6.9314718055994529E-1;
  138. CUDART_LN2_LO = 2.3190468138462996E-17;
  139. CUDART_LNT = 2.3025850929940459E+0;
  140. CUDART_LNT_HI = 2.3025850929940459E+0;
  141. CUDART_LNT_LO = -2.1707562233822494E-16;
  142. CUDART_LNPI = 1.1447298858494002E+0;
  143. CUDART_LN2_X_1024 = 7.0978271289338397E+2;
  144. CUDART_LN2_X_1025 = 7.1047586007394398E+2;
  145. CUDART_LN2_X_1075 = 7.4513321910194122E+2;
  146. CUDART_LG2_X_1024 = 3.0825471555991675E+2;
  147. CUDART_LG2_X_1075 = 3.2360724533877976E+2;
  148. CUDART_TWO_TO_23 = 8388608.0;
  149. CUDART_TWO_TO_52 = 4503599627370496.0;
  150. CUDART_TWO_TO_54 = 18014398509481984.0;
  151. CUDART_TWO_TO_M54 = 5.5511151231257827E-17;
  152. CUDART_TWO_TO_M1022 = 2.22507385850720140E-308;
  153. CUDART_TRIG_PLOSS = 2147483648.0;
  154. type
  155. TcudaError = (cudaSuccess, cudaErrorMissingConfiguration,
  156. cudaErrorMemoryAllocation, cudaErrorInitializationError,
  157. cudaErrorLaunchFailure, cudaErrorPriorLaunchFailure, cudaErrorLaunchTimeout,
  158. cudaErrorLaunchOutOfResources, cudaErrorInvalidDeviceFunction,
  159. cudaErrorInvalidConfiguration, cudaErrorInvalidDevice,
  160. cudaErrorInvalidValue, cudaErrorInvalidPitchValue, cudaErrorInvalidSymbol,
  161. cudaErrorMapBufferObjectFailed, cudaErrorUnmapBufferObjectFailed,
  162. cudaErrorInvalidHostPointer, cudaErrorInvalidDevicePointer,
  163. cudaErrorInvalidTexture, cudaErrorInvalidTextureBinding,
  164. cudaErrorInvalidChannelDescriptor, cudaErrorInvalidMemcpyDirection,
  165. cudaErrorAddressOfConstant, cudaErrorTextureFetchFailed,
  166. cudaErrorTextureNotBound, cudaErrorSynchronizationError,
  167. cudaErrorInvalidFilterSetting, cudaErrorInvalidNormSetting,
  168. cudaErrorMixedDeviceExecution, cudaErrorCudartUnloading, cudaErrorUnknown,
  169. cudaErrorNotYetImplemented, cudaErrorMemoryValueTooLarge,
  170. cudaErrorInvalidResourceHandle, cudaErrorNotReady, cudaErrorStartupFailure,
  171. cudaErrorApiFailureBase);
  172. { +//DEVICE_BUILTIN*/ }
  173. TCudaChannelFormatKind = (cudaChannelFormatKindSigned,
  174. cudaChannelFormatKindUnsigned, cudaChannelFormatKindFloat);
  175. TCudaGLMapFlags = (cudaGLMapFlagsNone,
  176. /// < Default; Assume resource can be read/written
  177. cudaGLMapFlagsReadOnly,
  178. /// < CUDA kernels will not write to this resource
  179. cudaGLMapFlagsWriteDiscard);
  180. /// < CUDA kernels will only write to and will not read from this resource
  181. { +//DEVICE_BUILTIN*/ }
  182. PcudaChannelFormatDesc = ^TCudaChannelFormatDesc;
  183. TCudaChannelFormatDesc = record
  184. x: Integer;
  185. y: Integer;
  186. z: Integer;
  187. w: Integer;
  188. f: TCudaChannelFormatKind;
  189. end;
  190. { +//DEVICE_BUILTIN*/ }
  191. TcudaArray = record
  192. end; // !ATTENTION foreward Declaration?)
  193. { +//DEVICE_BUILTIN*/ }
  194. TcudaMemcpyKind = (cudaMemcpyHostToHost { = 0 } , cudaMemcpyHostToDevice,
  195. cudaMemcpyDeviceToHost, cudaMemcpyDeviceToDevice);
  196. { +//DEVICE_BUILTIN*/ }
  197. TcudaPitchedPtr = record
  198. ptr: Pointer;
  199. pitch: NativeUInt;
  200. xsize: NativeUInt;
  201. ysize: NativeUInt;
  202. end;
  203. { +//DEVICE_BUILTIN*/ }
  204. TcudaExtent = record
  205. width: NativeUInt;
  206. height: NativeUInt;
  207. depth: NativeUInt;
  208. end;
  209. { +//DEVICE_BUILTIN*/ }
  210. TcudaPos = record
  211. x: NativeUInt;
  212. y: NativeUInt;
  213. z: NativeUInt;
  214. end;
  215. { +//DEVICE_BUILTIN*/ }
  216. TcudaMemcpy3DParms = record
  217. srcArray: Pointer;
  218. srcPos: TcudaPos;
  219. srcPtr: TcudaPitchedPtr;
  220. dstArray: Pointer;
  221. dstPos: TcudaPos;
  222. dstPtr: TcudaPitchedPtr;
  223. extent: TcudaExtent;
  224. kind: TcudaMemcpyKind;
  225. end;
  226. { +//DEVICE_BUILTIN*/ }
  227. PCudaDeviceProp = ^TCudaDeviceProp;
  228. TCudaDeviceProp = record
  229. name: array [0 .. 256 - 1] of AnsiChar;
  230. totalGlobalMem: NativeUInt;
  231. sharedMemPerBlock: NativeUInt;
  232. regsPerBlock: Integer;
  233. warpSize: Integer;
  234. memPitch: NativeUInt;
  235. maxThreadsPerBlock: Integer;
  236. maxThreadsDim: array [0 .. 3 - 1] of Integer;
  237. maxGridSize: array [0 .. 3 - 1] of Integer;
  238. clockRate: Integer;
  239. totalConstMem: NativeUInt;
  240. major: Integer;
  241. minor: Integer;
  242. textureAlignment: NativeUInt;
  243. deviceOverlap: Integer;
  244. multiProcessorCount: Integer;
  245. // Specified whether there is a run time limit on kernels
  246. kernelExecTimeoutEnabled: Integer;
  247. // Device is egrated as opposed to discrete
  248. egrated: Integer;
  249. // Device can map host memory with cudaHostAlloc/cudaHostGetDevicePoer
  250. canMapHostMemory: Integer;
  251. // Compute mode (See ::cudaComputeMode)
  252. computeMode: Integer;
  253. // Maximum 1D texture size
  254. maxTexture1D: Integer;
  255. // Maximum 2D texture dimensions
  256. maxTexture2D: array[0..1] of Integer;
  257. // Maximum 3D texture dimensions
  258. maxTexture3D: array[0..2] of Integer;
  259. // Maximum 2D texture array dimensions
  260. maxTexture2DArray: array[0..2] of Integer;
  261. // Alignment requirements for surfaces
  262. surfaceAlignment: NativeUInt;
  263. // Device can possibly execute multiple kernels concurrently
  264. concurrentKernels: Integer;
  265. // Device has ECC support enabled
  266. ECCEnabled: Integer;
  267. // PCI bus ID of the device
  268. pciBusID: Integer;
  269. // PCI device ID of the device
  270. pciDeviceID: Integer;
  271. // 1 if device is a Tesla device using TCC driver, 0 otherwise
  272. tccDriver: Integer;
  273. __cudaReserved: array [0 .. 20] of Integer;
  274. end;
  275. TcudaTextureAddressMode = (cudaAddressModeWrap, cudaAddressModeClamp, cudaAddressModeMirror);
  276. TcudaTextureFilterMode = (cudaFilterModePoint, cudaFilterModeLinear);
  277. TcudaTextureReadMode = (cudaReadModeElementType, cudaReadModeNormalizedFloat);
  278. PTextureReference = ^TTextureReference;
  279. TTextureReference = record
  280. normalized: Integer;
  281. filterMode: TcudaTextureFilterMode;
  282. addressMode: array [0 .. 2] of TcudaTextureAddressMode;
  283. channelDesc: TCudaChannelFormatDesc;
  284. __cudaReserved: array [0 .. 15] of Integer;
  285. end;
  286. PcudaArray = ^TcudaArray;
  287. { +//****************************************************************************** }
  288. { -** }
  289. { -* SHORTHAND TYPE DEFINITION USED BY RUNTIME API* }
  290. { -** }
  291. { =*******************************************************************************/ }
  292. { +//DEVICE_BUILTIN*/ }
  293. cudaError_t = TcudaError;
  294. { +//DEVICE_BUILTIN*/ }
  295. cudaStream_t = Integer;
  296. { +//DEVICE_BUILTIN*/ }
  297. cudaEvent_t = Integer;
  298. (*******************************************************************************)
  299. var
  300. cudaBindTexture: function(var offset: NativeUInt; const texref: PTextureReference;
  301. var devPtr: Pointer; var desc: TCudaChannelFormatDesc; size: NativeUInt): cudaError_t;
  302. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  303. cudaBindTexture2D: function(var offset: NativeUInt; const texref: PTextureReference; const devPtr: Pointer;
  304. var desc: TCudaChannelFormatDesc; width, height, pitch: NativeUInt): cudaError_t;
  305. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  306. cudaBindTextureToArray: function(const texref: PTextureReference; const cudaArray: PcudaArray): cudaError_t;
  307. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  308. cudaUnbindTexture: function(const texref: PTextureReference): cudaError_t;
  309. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  310. cudaGetTextureAlignmentOffset: function(offset: NativeUInt; const texref: PTextureReference): cudaError_t;
  311. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  312. cudaGetTextureReference: function(const texref: PTextureReference; const symbol: PAnsiChar): cudaError_t;
  313. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  314. cudaGetChannelDesc: function(var desc: TCudaChannelFormatDesc; const array_: Pointer): cudaError_t;
  315. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  316. cudaCreateChannelDesc: function(x, y, z, w: Integer; f: TCudaChannelFormatKind): TCudaChannelFormatDesc;
  317. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  318. (* ******************************************************************************
  319. * *
  320. * *
  321. * *
  322. ****************************************************************************** *)
  323. cudaMalloc3D: function(var pitchedDevPtr: TcudaPitchedPtr; extent: TcudaExtent): cudaError_t;
  324. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  325. cudaMalloc3DArray: function(var arrayPtr: PcudaArray; const desc: TCudaChannelFormatDesc; extent: TcudaExtent; flags: Cardinal): cudaError_t;
  326. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  327. cudaMemset3D: function(pitchedDevPtr: TcudaPitchedPtr; value: Integer; extent: TcudaExtent): cudaError_t;
  328. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  329. cudaMemcpy3D: function(const p: TcudaMemcpy3DParms): cudaError_t;
  330. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  331. cudaMemcpy3DAsync: function(const p: TcudaMemcpy3DParms; stream: cudaStream_t): cudaError_t;
  332. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  333. cudaMalloc: function(var devPtr; size: NativeUInt): cudaError_t;
  334. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  335. cudaMallocHost: function(var ptr: Pointer; size: NativeUInt): cudaError_t;
  336. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  337. cudaMallocPitch: function(var devPtr; var pitch: NativeUInt; width: NativeUInt; height: NativeUInt): cudaError_t;
  338. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  339. cudaMallocArray: function(var aarray: Pointer; var desc: TCudaChannelFormatDesc; width: NativeUInt; height: NativeUInt): cudaError_t;
  340. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  341. cudaFree: function(devPtr: Pointer): cudaError_t;
  342. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  343. cudaFreeHost: function(ptr: Pointer): cudaError_t;
  344. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  345. cudaFreeArray: function(const aarray: Pointer): cudaError_t;
  346. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  347. cudaHostAlloc: function(var pHost: Pointer; bytes: NativeUInt; flags: Cardinal): cudaError_t;
  348. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  349. cudaHostGetDevicePointer: function(var pDevice: Pointer; pHost: Pointer; flags: Cardinal): cudaError_t;
  350. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  351. cudaHostGetFlags: function(var pFlags: Cardinal; pHost: Pointer): cudaError_t;
  352. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  353. cudaMemGetInfo: function(var free: NativeUInt; var total: NativeUInt): cudaError_t;
  354. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  355. cudaMemcpy: function(dst: Pointer; src: Pointer; count: NativeUInt; kind: TcudaMemcpyKind): cudaError_t;
  356. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  357. cudaMemcpyToArray: function(var dst: PcudaArray; wOffset: NativeUInt; hOffset: NativeUInt; var src; count: NativeUInt; kind: TcudaMemcpyKind): cudaError_t;
  358. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  359. cudaMemcpyFromArray: function(var dst; const src: PcudaArray; wOffset: NativeUInt; hOffset: NativeUInt; count: NativeUInt; kind: TcudaMemcpyKind): cudaError_t;
  360. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  361. cudaMemcpyArrayToArray: function(dst: PcudaArray; wOffsetDst: NativeUInt; hOffsetDst: NativeUInt; const src: PcudaArray; wOffsetSrc: NativeUInt;
  362. hOffsetSrc: NativeUInt; count: NativeUInt; const kind: TcudaMemcpyKind = cudaMemcpyDeviceToDevice): cudaError_t;
  363. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  364. cudaMemcpy2D: function(var dst; dpitch: NativeUInt; var src; spitch: NativeUInt;
  365. width: NativeUInt; height: NativeUInt; kind: TcudaMemcpyKind): cudaError_t;
  366. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  367. cudaMemcpy2DToArray: function(dst: PcudaArray; wOffset: NativeUInt;
  368. hOffset: NativeUInt; var src; spitch: NativeUInt; width: NativeUInt; height: NativeUInt; kind: TcudaMemcpyKind): cudaError_t;
  369. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  370. cudaMemcpy2DFromArray: function(var dst; dpitch: NativeUInt; src: PcudaArray; wOffset: NativeUInt; hOffset: NativeUInt; width: NativeUInt; height: NativeUInt;
  371. kind: TcudaMemcpyKind): cudaError_t;
  372. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  373. cudaMemcpy2DArrayToArray: function(dst: PcudaArray; wOffsetDst: NativeUInt;
  374. hOffsetDst: NativeUInt; src: PcudaArray; wOffsetSrc: NativeUInt; hOffsetSrc: NativeUInt;
  375. width: NativeUInt; height: NativeUInt; const kind: TcudaMemcpyKind = cudaMemcpyDeviceToDevice): cudaError_t;
  376. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  377. cudaMemcpyToSymbol: function(symbol: PAnsiChar; var src; count: NativeUInt; const offset: NativeUInt = 0;
  378. const kind: TcudaMemcpyKind = cudaMemcpyHostToDevice): cudaError_t;
  379. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  380. cudaMemcpyFromSymbol: function(var dst; symbol: PAnsiChar; count: NativeUInt; const offset: NativeUInt = 0;
  381. const kind: TcudaMemcpyKind = cudaMemcpyDeviceToHost): cudaError_t;
  382. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  383. { +//*************************************************************************** }
  384. { -** }
  385. { -** }
  386. { -** }
  387. { =***************************************************************************** }
  388. cudaMemcpyAsync: function(var dst; const src; count: NativeUInt; kind: TcudaMemcpyKind; stream: cudaStream_t): cudaError_t;
  389. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  390. cudaMemcpyToArrayAsync: function(dst: PcudaArray; wOffset: NativeUInt; hOffset: NativeUInt; const src; count: NativeUInt; kind: TcudaMemcpyKind;
  391. stream: cudaStream_t): cudaError_t;
  392. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  393. cudaMemcpyFromArrayAsync: function(var dst; const src: PcudaArray;
  394. wOffset: NativeUInt; hOffset: NativeUInt; count: NativeUInt; kind: TcudaMemcpyKind; stream: cudaStream_t): cudaError_t;
  395. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  396. cudaMemcpy2DAsync: function(var dst; dpitch: NativeUInt; const src;
  397. spitch: NativeUInt; width: NativeUInt; height: NativeUInt; kind: TcudaMemcpyKind; stream: cudaStream_t): cudaError_t;
  398. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  399. cudaMemcpy2DToArrayAsync: function(dst: PcudaArray; wOffset: NativeUInt;
  400. hOffset: NativeUInt; const src; spitch: NativeUInt; width: NativeUInt; height: NativeUInt;
  401. kind: TcudaMemcpyKind; stream: cudaStream_t): cudaError_t;
  402. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  403. cudaMemcpy2DFromArrayAsync: function(var dst; dpitch: NativeUInt;
  404. const src: PcudaArray; wOffset: NativeUInt; hOffset: NativeUInt; width: NativeUInt;
  405. height: NativeUInt; kind: TcudaMemcpyKind; stream: cudaStream_t): cudaError_t;
  406. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  407. cudaMemcpyToSymbolAsync: function(const symbol: PAnsiChar; const src;
  408. count: NativeUInt; offset: NativeUInt; kind: TcudaMemcpyKind; stream: cudaStream_t): cudaError_t;
  409. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  410. cudaMemcpyFromSymbolAsync: function(var dst; const symbol: PAnsiChar;
  411. count: NativeUInt; offset: NativeUInt; kind: TcudaMemcpyKind; stream: cudaStream_t): cudaError_t;
  412. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  413. (******************************************************************************
  414. * *
  415. * *
  416. * *
  417. *****************************************************************************)
  418. cudaMemset: function(var devPtr; value: Integer; count: NativeUInt): cudaError_t;
  419. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  420. cudaMemset2D: function(var devPtr; pitch: NativeUInt; value: Integer;
  421. width: NativeUInt; height: NativeUInt): cudaError_t;
  422. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  423. (*****************************************************************************
  424. * *
  425. * *
  426. * *
  427. *****************************************************************************)
  428. cudaGetSymbolAddress: function(var devPtr: Pointer; const symbol: PAnsiChar): cudaError_t;
  429. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  430. cudaGetSymbolSize: function(var size: NativeUInt; const symbol: PAnsiChar): cudaError_t;
  431. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  432. { +//*************************************************************************** }
  433. { -** }
  434. { -** }
  435. { -** }
  436. { =***************************************************************************** }
  437. cudaGetDeviceCount: function(var count: Integer): cudaError_t;
  438. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  439. cudaGetDeviceProperties: function(var prop: TCudaDeviceProp; device: Integer): cudaError_t;
  440. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  441. cudaChooseDevice: function(var device: Integer; const prop: PCudaDeviceProp): cudaError_t;
  442. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  443. cudaSetDevice: function(device: Integer): cudaError_t;
  444. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  445. cudaGetDevice: function(var device: Integer): cudaError_t;
  446. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  447. cudaSetDeviceFlags: function(flags: Integer): cudaError_t;
  448. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  449. cudaSetValidDevices: function(device_arr: PInteger; len: Integer): cudaError_t;
  450. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  451. (******************************************************************************
  452. *
  453. *
  454. *
  455. *****************************************************************************)
  456. cudaConfigureCall: function(gridDim, blockDim: TDim3; sharedMem: NativeUInt; stream: cudaStream_t): cudaError_t;
  457. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  458. cudaSetupArgument: function(const arg: Pointer; size: NativeUInt; offset: NativeUInt): cudaError_t;
  459. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  460. cudaFuncSetCacheConfig: function(const func: PAnsiChar; cacheConfig: TcudaFuncCache): cudaError_t;
  461. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  462. cudaLaunch: function(const entry: PAnsiChar): cudaError_t;
  463. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  464. cudaFuncGetAttributes: function(var attr: TcudaFuncAttributes; const func: PAnsiChar): cudaError_t;
  465. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  466. { +//****************************************************************************** }
  467. { -** }
  468. { -** }
  469. { -** }
  470. { =*******************************************************************************/ }
  471. cudaGetLastError: function: cudaError_t;
  472. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  473. { +//****************************************************************************** }
  474. { -** }
  475. { -** }
  476. { -** }
  477. { =*******************************************************************************/ }
  478. cudaGLSetGLDevice: function(device: Integer): cudaError_t;
  479. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  480. cudaGLRegisterBufferObject: function(bufObj: Cardinal): cudaError_t;
  481. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  482. cudaGraphicsGLRegisterImage: function(const resource: PCUgraphicsResource; image: Cardinal; target: Cardinal; flags: Cardinal): cudaError_t;
  483. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  484. cudaGraphicsGLRegisterBuffer: function(const resource: PCUgraphicsResource; buffer: Cardinal; flags: Cardinal): cudaError_t;
  485. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  486. cudaGLMapBufferObject: function(devPtr: Pointer; bufObj: Cardinal): cudaError_t;
  487. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  488. cudaGLUnmapBufferObject: function(bufObj: Cardinal): cudaError_t;
  489. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  490. cudaGLUnregisterBufferObject: function(bufObj: Cardinal): cudaError_t;
  491. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  492. cudaGLSetBufferObjectMapFlags: function(bufObj: Cardinal; flags: TCudaGLMapFlags): cudaError_t;
  493. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  494. cudaGLMapBufferObjectAsync: function(var devPtr: Pointer; bufObj: Cardinal; stream: cudaStream_t): cudaError_t;
  495. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  496. cudaGLUnmapBufferObjectAsync: function(bufObj: Cardinal; stream: cudaStream_t): cudaError_t;
  497. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  498. cudaGraphicsUnregisterResource: function(resource: PCUgraphicsResource): cudaError_t;
  499. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  500. cudaGraphicsResourceSetMapFlags: function(resource: PCUgraphicsResource; flags: Cardinal): cudaError_t;
  501. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  502. cudaGraphicsMapResources: function(count: Integer; const resources: PCUgraphicsResource; stream: cudaStream_t): cudaError_t;
  503. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  504. cudaGraphicsUnmapResources: function(count: Integer; const resources: PCUgraphicsResource; stream: cudaStream_t): cudaError_t;
  505. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  506. cudaGraphicsResourceGetMappedPointer: function(var pDevPtr: TCUdeviceptr;
  507. var pSize: Cardinal; resource: PCUgraphicsResource): cudaError_t;
  508. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  509. cudaGraphicsSubResourceGetMappedArray: function(var pArray: PCUarray;
  510. resource: PCUgraphicsResource; arrayIndex: Cardinal; mipLevel: Cardinal): cudaError_t;
  511. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  512. cudaGetErrorString: function(error: cudaError_t): PAnsiChar;
  513. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  514. cudaDriverGetVersion: function(out driverVersion: Integer): cudaError_t;
  515. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  516. cudaRuntimeGetVersion: function(out runtimeVersion: Integer): cudaError_t;
  517. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  518. (* ******************************************************************************
  519. * *
  520. * *
  521. * *
  522. ****************************************************************************** *)
  523. cudaSetDoubleForDevice: function(var d: Double): cudaError_t;
  524. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  525. cudaSetDoubleForHost: function(var d: Double): cudaError_t;
  526. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  527. (* ******************************************************************************
  528. * *
  529. * *
  530. * *
  531. ****************************************************************************** *)
  532. cudaStreamCreate: function(var pStream: cudaStream_t): cudaError_t;
  533. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  534. cudaStreamDestroy: function(stream: cudaStream_t): cudaError_t;
  535. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  536. cudaStreamSynchronize: function(stream: cudaStream_t): cudaError_t;
  537. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  538. cudaStreamQuery: function(stream: cudaStream_t): cudaError_t;
  539. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  540. (* ******************************************************************************
  541. * *
  542. * *
  543. * *
  544. ****************************************************************************** *)
  545. cudaEventCreate: function(var event: cudaEvent_t): cudaError_t;
  546. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  547. cudaEventCreateWithFlags: function(var event: cudaEvent_t; flags: Integer): cudaError_t;
  548. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  549. cudaEventRecord: function(event: cudaEvent_t; stream: cudaStream_t): cudaError_t;
  550. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  551. cudaEventQuery: function(event: cudaEvent_t): cudaError_t;
  552. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  553. cudaEventSynchronize: function(event: cudaEvent_t): cudaError_t;
  554. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  555. cudaEventDestroy: function(event: cudaEvent_t): cudaError_t;
  556. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  557. cudaEventElapsedTime: function(var ms: Single; start: cudaEvent_t; ending: cudaEvent_t): cudaError_t;
  558. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  559. cudaWGLGetDevice: function(var device: Integer; hGpu: HGPUNV): cudaError_t;
  560. {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  561. (* ******************************************************************************
  562. * *
  563. * *
  564. * *
  565. ****************************************************************************** *)
  566. cudaThreadExit: function(): cudaError_t;{$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  567. cudaThreadSynchronize: function(): cudaError_t;{$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  568. cudaThreadSetLimit: function(limit: TcudaLimit; value: NativeUInt): cudaError_t;{$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  569. cudaThreadGetLimit: function(var value: NativeUInt; limit: TcudaLimit): cudaError_t;{$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
  570. function cudaGetLastErrorString: string;
  571. function InitCUDART: Boolean;
  572. procedure CloseCUDART;
  573. function InitCUDARTFromLibrary(const LibName: WideString): Boolean;
  574. function IsCUDARTInitialized: Boolean;
  575. //--------------------------------------------
  576. implementation
  577. //--------------------------------------------
  578. function cudaGetLastErrorString: string;
  579. begin
  580. Result := string(cudaGetErrorString(cudaGetLastError));
  581. end;
  582. const
  583. INVALID_MODULEHANDLE = 0;
  584. var
  585. {$IFDEF MSWINDOWS}
  586. CUDARTHandle: HINST = INVALID_MODULEHANDLE;
  587. {$ELSE}
  588. CUDARTHandle: TLibHandle = INVALID_MODULEHANDLE;
  589. {$ENDIF}
  590. function CUDARTGetProcAddress(ProcName: PAnsiChar): Pointer;
  591. begin
  592. Result := GetProcAddress(CUDARTHandle, ProcName);
  593. end;
  594. function InitCUDART: Boolean;
  595. var
  596. I: Integer;
  597. begin
  598. Result := True;
  599. if CUDARTHandle = INVALID_MODULEHANDLE then
  600. begin
  601. for I := 0 to High(CUDARTDLLNAMES) do
  602. begin
  603. if InitCUDARTFromLibrary(CUDARTDLLNAMES[I] + '.dll') then
  604. Exit;
  605. end;
  606. end;
  607. Result := False;
  608. end;
  609. procedure CloseCUDART;
  610. begin
  611. if CUDARTHandle <> INVALID_MODULEHANDLE then
  612. begin
  613. FreeLibrary(CUDARTHandle);
  614. CUDARTHandle := INVALID_MODULEHANDLE;
  615. end;
  616. end;
  617. function InitCUDARTFromLibrary(const LibName: WideString): Boolean;
  618. var
  619. V: Integer;
  620. begin
  621. CloseCUDART;
  622. CUDARTHandle := GetModuleHandleW(PWideChar(LibName));
  623. if CUDARTHandle = INVALID_MODULEHANDLE then
  624. CUDARTHandle := LoadLibraryW(PWideChar(LibName));
  625. if CUDARTHandle = INVALID_MODULEHANDLE then
  626. Exit(False);
  627. cudaFreeHost := CUDARTGetProcAddress('cudaFreeHost');
  628. cudaFuncGetAttributes := CUDARTGetProcAddress('cudaFuncGetAttributes');
  629. cudaGetChannelDesc := CUDARTGetProcAddress('cudaGetChannelDesc');
  630. cudaGetDevice := CUDARTGetProcAddress('cudaGetDevice');
  631. cudaGetDeviceCount := CUDARTGetProcAddress('cudaGetDeviceCount');
  632. cudaGetDeviceProperties := CUDARTGetProcAddress('cudaGetDeviceProperties');
  633. cudaGetErrorString := CUDARTGetProcAddress('cudaGetErrorString');
  634. cudaGetLastError := CUDARTGetProcAddress('cudaGetLastError');
  635. cudaGetSymbolAddress := CUDARTGetProcAddress('cudaGetSymbolAddress');
  636. cudaGetSymbolSize := CUDARTGetProcAddress('cudaGetSymbolSize');
  637. cudaGetTextureAlignmentOffset := CUDARTGetProcAddress('cudaGetTextureAlignmentOffset');
  638. cudaGetTextureReference := CUDARTGetProcAddress('cudaGetTextureReference');
  639. cudaGLMapBufferObject := CUDARTGetProcAddress('cudaGLMapBufferObject');
  640. cudaGLMapBufferObjectAsync := CUDARTGetProcAddress('cudaGLMapBufferObjectAsync');
  641. cudaGLRegisterBufferObject := CUDARTGetProcAddress('cudaGLRegisterBufferObject');
  642. cudaGLSetBufferObjectMapFlags := CUDARTGetProcAddress('cudaGLSetBufferObjectMapFlags');
  643. cudaGLSetGLDevice := CUDARTGetProcAddress('cudaGLSetGLDevice');
  644. cudaGLUnmapBufferObject := CUDARTGetProcAddress('cudaGLUnmapBufferObject');
  645. cudaGLUnmapBufferObjectAsync := CUDARTGetProcAddress('cudaGLUnmapBufferObjectAsync');
  646. cudaGLUnregisterBufferObject := CUDARTGetProcAddress('cudaGLUnregisterBufferObject');
  647. cudaGraphicsGLRegisterBuffer := CUDARTGetProcAddress('cudaGraphicsGLRegisterBuffer');
  648. cudaGraphicsGLRegisterImage := CUDARTGetProcAddress('cudaGraphicsGLRegisterImage');
  649. cudaGraphicsMapResources := CUDARTGetProcAddress('cudaGraphicsMapResources');
  650. cudaGraphicsResourceGetMappedPointer := CUDARTGetProcAddress('cudaGraphicsResourceGetMappedPointer');
  651. cudaGraphicsResourceSetMapFlags := CUDARTGetProcAddress('cudaGraphicsResourceSetMapFlags');
  652. cudaGraphicsSubResourceGetMappedArray := CUDARTGetProcAddress('cudaGraphicsSubResourceGetMappedArray');
  653. cudaGraphicsUnmapResources := CUDARTGetProcAddress('cudaGraphicsUnmapResources');
  654. cudaGraphicsUnregisterResource := CUDARTGetProcAddress('cudaGraphicsUnregisterResource');
  655. cudaHostAlloc := CUDARTGetProcAddress('cudaHostAlloc');
  656. cudaHostGetDevicePointer := CUDARTGetProcAddress('cudaHostGetDevicePointer');
  657. cudaHostGetFlags := CUDARTGetProcAddress('cudaHostGetFlags');
  658. cudaLaunch := CUDARTGetProcAddress('cudaLaunch');
  659. cudaMalloc := CUDARTGetProcAddress('cudaMalloc');
  660. cudaMalloc3D := CUDARTGetProcAddress('cudaMalloc3D');
  661. cudaMalloc3DArray := CUDARTGetProcAddress('cudaMalloc3DArray');
  662. cudaMallocArray := CUDARTGetProcAddress('cudaMallocArray');
  663. cudaMallocHost := CUDARTGetProcAddress('cudaMallocHost');
  664. cudaMallocPitch := CUDARTGetProcAddress('cudaMallocPitch');
  665. cudaMemcpy := CUDARTGetProcAddress('cudaMemcpy');
  666. cudaMemcpy2D := CUDARTGetProcAddress('cudaMemcpy2D');
  667. cudaMemcpy2DArrayToArray := CUDARTGetProcAddress('cudaMemcpy2DArrayToArray');
  668. cudaMemcpy2DAsync := CUDARTGetProcAddress('cudaMemcpy2DAsync');
  669. cudaMemcpy2DFromArray := CUDARTGetProcAddress('cudaMemcpy2DFromArray');
  670. cudaMemcpy2DFromArrayAsync := CUDARTGetProcAddress('cudaMemcpy2DFromArrayAsync');
  671. cudaMemcpy2DToArray := CUDARTGetProcAddress('cudaMemcpy2DToArray');
  672. cudaMemcpy2DToArrayAsync := CUDARTGetProcAddress('cudaMemcpy2DToArrayAsync');
  673. cudaMemcpy3D := CUDARTGetProcAddress('cudaMemcpy3D');
  674. cudaMemcpy3DAsync := CUDARTGetProcAddress('cudaMemcpy3DAsync');
  675. cudaMemcpyArrayToArray := CUDARTGetProcAddress('cudaMemcpyArrayToArray');
  676. cudaMemcpyAsync := CUDARTGetProcAddress('cudaMemcpyAsync');
  677. cudaMemcpyFromArray := CUDARTGetProcAddress('cudaMemcpyFromArray');
  678. cudaMemcpyFromArrayAsync := CUDARTGetProcAddress('cudaMemcpyFromArrayAsync');
  679. cudaMemcpyFromSymbol := CUDARTGetProcAddress('cudaMemcpyFromSymbol');
  680. cudaMemcpyFromSymbolAsync := CUDARTGetProcAddress('cudaMemcpyFromSymbolAsync');
  681. cudaMemcpyToArray := CUDARTGetProcAddress('cudaMemcpyToArray');
  682. cudaMemcpyToArrayAsync := CUDARTGetProcAddress('cudaMemcpyToArrayAsync');
  683. cudaMemcpyToSymbol := CUDARTGetProcAddress('cudaMemcpyToSymbol');
  684. cudaMemcpyToSymbolAsync := CUDARTGetProcAddress('cudaMemcpyToSymbolAsync');
  685. cudaMemGetInfo := CUDARTGetProcAddress('cudaMemGetInfo');
  686. cudaMemset := CUDARTGetProcAddress('cudaMemset');
  687. cudaMemset2D := CUDARTGetProcAddress('cudaMemset2D');
  688. cudaMemset3D := CUDARTGetProcAddress('cudaMemset3D');
  689. cudaRuntimeGetVersion := CUDARTGetProcAddress('cudaRuntimeGetVersion');
  690. cudaSetDevice := CUDARTGetProcAddress('cudaSetDevice');
  691. cudaSetDeviceFlags := CUDARTGetProcAddress('cudaSetDeviceFlags');
  692. cudaSetDoubleForDevice := CUDARTGetProcAddress('cudaSetDoubleForDevice');
  693. cudaSetDoubleForHost := CUDARTGetProcAddress('cudaSetDoubleForHost');
  694. cudaSetupArgument := CUDARTGetProcAddress('cudaSetupArgument');
  695. cudaSetValidDevices := CUDARTGetProcAddress('cudaSetValidDevices');
  696. cudaStreamCreate := CUDARTGetProcAddress('cudaStreamCreate');
  697. cudaStreamDestroy := CUDARTGetProcAddress('cudaStreamDestroy');
  698. cudaStreamQuery := CUDARTGetProcAddress('cudaStreamQuery');
  699. cudaStreamSynchronize := CUDARTGetProcAddress('cudaStreamSynchronize');
  700. cudaThreadExit := CUDARTGetProcAddress('cudaThreadExit');
  701. cudaThreadSynchronize := CUDARTGetProcAddress('cudaThreadSynchronize');
  702. cudaThreadSetLimit := CUDARTGetProcAddress('cudaThreadSetLimit');
  703. cudaThreadGetLimit := CUDARTGetProcAddress('cudaThreadGetLimit');
  704. cudaUnbindTexture := CUDARTGetProcAddress('cudaUnbindTexture');
  705. cudaWGLGetDevice := CUDARTGetProcAddress('cudaWGLGetDevice');
  706. cudaRuntimeGetVersion(V);
  707. /// GLSLogger.LogInfoFmt('%s version %d is loaded', [LibName, V]);
  708. Result := True;
  709. end;
  710. function IsCUDARTInitialized: Boolean;
  711. begin
  712. Result := (CUDARTHandle <> INVALID_MODULEHANDLE);
  713. end;
  714. //-----------------------------------------------
  715. initialization
  716. //-----------------------------------------------
  717. //-----------------------------------------------
  718. finalization
  719. //-----------------------------------------------
  720. CloseCUDART;
  721. end.