CUDAx.RunTime.pas 36 KB

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