vBLAS.pas 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. {
  2. File: vecLib/vBLAS.h
  3. Contains: Header for the Basic Linear Algebra Subprograms, with Apple extensions.
  4. Version: vecLib-$(vDSP_Version0).$(vDSP_Version1)
  5. Copyright: © 2000-$(Year) by Apple Computer, Inc., all rights reserved.
  6. Bugs?: For bug reports, consult the following page on
  7. the World Wide Web:
  8. http://bugs.freepascal.org
  9. }
  10. { Pascal Translation Updated: Jonas Maebe, <[email protected]>, October 2009 }
  11. { Pascal Translation Updated: Jonas Maebe, <[email protected]>, October 2012 }
  12. {
  13. Modified for use with Free Pascal
  14. Version 308
  15. Please report any bugs to <[email protected]>
  16. }
  17. {$ifc not defined MACOSALLINCLUDE or not MACOSALLINCLUDE}
  18. {$mode macpas}
  19. {$packenum 1}
  20. {$macro on}
  21. {$inline on}
  22. {$calling mwpascal}
  23. unit vBLAS;
  24. interface
  25. {$setc UNIVERSAL_INTERFACES_VERSION := $0400}
  26. {$setc GAP_INTERFACES_VERSION := $0308}
  27. {$ifc not defined USE_CFSTR_CONSTANT_MACROS}
  28. {$setc USE_CFSTR_CONSTANT_MACROS := TRUE}
  29. {$endc}
  30. {$ifc defined CPUPOWERPC and defined CPUI386}
  31. {$error Conflicting initial definitions for CPUPOWERPC and CPUI386}
  32. {$endc}
  33. {$ifc defined FPC_BIG_ENDIAN and defined FPC_LITTLE_ENDIAN}
  34. {$error Conflicting initial definitions for FPC_BIG_ENDIAN and FPC_LITTLE_ENDIAN}
  35. {$endc}
  36. {$ifc not defined __ppc__ and defined CPUPOWERPC32}
  37. {$setc __ppc__ := 1}
  38. {$elsec}
  39. {$setc __ppc__ := 0}
  40. {$endc}
  41. {$ifc not defined __ppc64__ and defined CPUPOWERPC64}
  42. {$setc __ppc64__ := 1}
  43. {$elsec}
  44. {$setc __ppc64__ := 0}
  45. {$endc}
  46. {$ifc not defined __i386__ and defined CPUI386}
  47. {$setc __i386__ := 1}
  48. {$elsec}
  49. {$setc __i386__ := 0}
  50. {$endc}
  51. {$ifc not defined __x86_64__ and defined CPUX86_64}
  52. {$setc __x86_64__ := 1}
  53. {$elsec}
  54. {$setc __x86_64__ := 0}
  55. {$endc}
  56. {$ifc not defined __arm__ and defined CPUARM}
  57. {$setc __arm__ := 1}
  58. {$elsec}
  59. {$setc __arm__ := 0}
  60. {$endc}
  61. {$ifc not defined __arm64__ and defined CPUAARCH64}
  62. {$setc __arm64__ := 1}
  63. {$elsec}
  64. {$setc __arm64__ := 0}
  65. {$endc}
  66. {$ifc defined cpu64}
  67. {$setc __LP64__ := 1}
  68. {$elsec}
  69. {$setc __LP64__ := 0}
  70. {$endc}
  71. {$ifc defined __ppc__ and __ppc__ and defined __i386__ and __i386__}
  72. {$error Conflicting definitions for __ppc__ and __i386__}
  73. {$endc}
  74. {$ifc defined __ppc__ and __ppc__}
  75. {$setc TARGET_CPU_PPC := TRUE}
  76. {$setc TARGET_CPU_PPC64 := FALSE}
  77. {$setc TARGET_CPU_X86 := FALSE}
  78. {$setc TARGET_CPU_X86_64 := FALSE}
  79. {$setc TARGET_CPU_ARM := FALSE}
  80. {$setc TARGET_CPU_ARM64 := FALSE}
  81. {$setc TARGET_OS_MAC := TRUE}
  82. {$setc TARGET_OS_IPHONE := FALSE}
  83. {$setc TARGET_IPHONE_SIMULATOR := FALSE}
  84. {$setc TARGET_OS_EMBEDDED := FALSE}
  85. {$elifc defined __ppc64__ and __ppc64__}
  86. {$setc TARGET_CPU_PPC := FALSE}
  87. {$setc TARGET_CPU_PPC64 := TRUE}
  88. {$setc TARGET_CPU_X86 := FALSE}
  89. {$setc TARGET_CPU_X86_64 := FALSE}
  90. {$setc TARGET_CPU_ARM := FALSE}
  91. {$setc TARGET_CPU_ARM64 := FALSE}
  92. {$setc TARGET_OS_MAC := TRUE}
  93. {$setc TARGET_OS_IPHONE := FALSE}
  94. {$setc TARGET_IPHONE_SIMULATOR := FALSE}
  95. {$setc TARGET_OS_EMBEDDED := FALSE}
  96. {$elifc defined __i386__ and __i386__}
  97. {$setc TARGET_CPU_PPC := FALSE}
  98. {$setc TARGET_CPU_PPC64 := FALSE}
  99. {$setc TARGET_CPU_X86 := TRUE}
  100. {$setc TARGET_CPU_X86_64 := FALSE}
  101. {$setc TARGET_CPU_ARM := FALSE}
  102. {$setc TARGET_CPU_ARM64 := FALSE}
  103. {$ifc defined(iphonesim)}
  104. {$setc TARGET_OS_MAC := FALSE}
  105. {$setc TARGET_OS_IPHONE := TRUE}
  106. {$setc TARGET_IPHONE_SIMULATOR := TRUE}
  107. {$elsec}
  108. {$setc TARGET_OS_MAC := TRUE}
  109. {$setc TARGET_OS_IPHONE := FALSE}
  110. {$setc TARGET_IPHONE_SIMULATOR := FALSE}
  111. {$endc}
  112. {$setc TARGET_OS_EMBEDDED := FALSE}
  113. {$elifc defined __x86_64__ and __x86_64__}
  114. {$setc TARGET_CPU_PPC := FALSE}
  115. {$setc TARGET_CPU_PPC64 := FALSE}
  116. {$setc TARGET_CPU_X86 := FALSE}
  117. {$setc TARGET_CPU_X86_64 := TRUE}
  118. {$setc TARGET_CPU_ARM := FALSE}
  119. {$setc TARGET_CPU_ARM64 := FALSE}
  120. {$ifc defined(iphonesim)}
  121. {$setc TARGET_OS_MAC := FALSE}
  122. {$setc TARGET_OS_IPHONE := TRUE}
  123. {$setc TARGET_IPHONE_SIMULATOR := TRUE}
  124. {$elsec}
  125. {$setc TARGET_OS_MAC := TRUE}
  126. {$setc TARGET_OS_IPHONE := FALSE}
  127. {$setc TARGET_IPHONE_SIMULATOR := FALSE}
  128. {$endc}
  129. {$setc TARGET_OS_EMBEDDED := FALSE}
  130. {$elifc defined __arm__ and __arm__}
  131. {$setc TARGET_CPU_PPC := FALSE}
  132. {$setc TARGET_CPU_PPC64 := FALSE}
  133. {$setc TARGET_CPU_X86 := FALSE}
  134. {$setc TARGET_CPU_X86_64 := FALSE}
  135. {$setc TARGET_CPU_ARM := TRUE}
  136. {$setc TARGET_CPU_ARM64 := FALSE}
  137. { will require compiler define when/if other Apple devices with ARM cpus ship }
  138. {$setc TARGET_OS_MAC := FALSE}
  139. {$setc TARGET_OS_IPHONE := TRUE}
  140. {$setc TARGET_IPHONE_SIMULATOR := FALSE}
  141. {$setc TARGET_OS_EMBEDDED := TRUE}
  142. {$elifc defined __arm64__ and __arm64__}
  143. {$setc TARGET_CPU_PPC := FALSE}
  144. {$setc TARGET_CPU_PPC64 := FALSE}
  145. {$setc TARGET_CPU_X86 := FALSE}
  146. {$setc TARGET_CPU_X86_64 := FALSE}
  147. {$setc TARGET_CPU_ARM := FALSE}
  148. {$setc TARGET_CPU_ARM64 := TRUE}
  149. { will require compiler define when/if other Apple devices with ARM cpus ship }
  150. {$setc TARGET_OS_MAC := FALSE}
  151. {$setc TARGET_OS_IPHONE := TRUE}
  152. {$setc TARGET_IPHONE_SIMULATOR := FALSE}
  153. {$setc TARGET_OS_EMBEDDED := TRUE}
  154. {$elsec}
  155. {$error __ppc__ nor __ppc64__ nor __i386__ nor __x86_64__ nor __arm__ nor __arm64__ is defined.}
  156. {$endc}
  157. {$ifc defined __LP64__ and __LP64__ }
  158. {$setc TARGET_CPU_64 := TRUE}
  159. {$elsec}
  160. {$setc TARGET_CPU_64 := FALSE}
  161. {$endc}
  162. {$ifc defined FPC_BIG_ENDIAN}
  163. {$setc TARGET_RT_BIG_ENDIAN := TRUE}
  164. {$setc TARGET_RT_LITTLE_ENDIAN := FALSE}
  165. {$elifc defined FPC_LITTLE_ENDIAN}
  166. {$setc TARGET_RT_BIG_ENDIAN := FALSE}
  167. {$setc TARGET_RT_LITTLE_ENDIAN := TRUE}
  168. {$elsec}
  169. {$error Neither FPC_BIG_ENDIAN nor FPC_LITTLE_ENDIAN are defined.}
  170. {$endc}
  171. {$setc ACCESSOR_CALLS_ARE_FUNCTIONS := TRUE}
  172. {$setc CALL_NOT_IN_CARBON := FALSE}
  173. {$setc OLDROUTINENAMES := FALSE}
  174. {$setc OPAQUE_TOOLBOX_STRUCTS := TRUE}
  175. {$setc OPAQUE_UPP_TYPES := TRUE}
  176. {$setc OTCARBONAPPLICATION := TRUE}
  177. {$setc OTKERNEL := FALSE}
  178. {$setc PM_USE_SESSION_APIS := TRUE}
  179. {$setc TARGET_API_MAC_CARBON := TRUE}
  180. {$setc TARGET_API_MAC_OS8 := FALSE}
  181. {$setc TARGET_API_MAC_OSX := TRUE}
  182. {$setc TARGET_CARBON := TRUE}
  183. {$setc TARGET_CPU_68K := FALSE}
  184. {$setc TARGET_CPU_MIPS := FALSE}
  185. {$setc TARGET_CPU_SPARC := FALSE}
  186. {$setc TARGET_OS_UNIX := FALSE}
  187. {$setc TARGET_OS_WIN32 := FALSE}
  188. {$setc TARGET_RT_MAC_68881 := FALSE}
  189. {$setc TARGET_RT_MAC_CFM := FALSE}
  190. {$setc TARGET_RT_MAC_MACHO := TRUE}
  191. {$setc TYPED_FUNCTION_POINTERS := TRUE}
  192. {$setc TYPE_BOOL := FALSE}
  193. {$setc TYPE_EXTENDED := FALSE}
  194. {$setc TYPE_LONGLONG := TRUE}
  195. uses MacTypes,ConditionalMacros;
  196. {$endc} {not MACOSALLINCLUDE}
  197. {$ifc TARGET_OS_MAC}
  198. {$ALIGN POWER}
  199. { ==========================================================================================================================}
  200. {
  201. =================================================================================================
  202. Definitions of the Basic Linear Algebra Subprograms (BLAS) as provided Apple Computer.
  203. A few additional functions, unique to Mac OS, have also been provided.
  204. These are clearly documented as Apple extensions.
  205. Documentation on the BLAS standard, including reference implementations, can be found on the web
  206. starting from the BLAS FAQ page at these URLs (verified live as of April 2002):
  207. http://www.netlib.org/blas/faq.html
  208. http://www.netlib.org/blas/blast-forum/blast-forum.html
  209. =================================================================================================
  210. }
  211. {
  212. =================================================================================================
  213. Matrix shape and storage
  214. ========================
  215. Keeping the various matrix shape and storage parameters straight can be difficult. The BLAS
  216. documentation generally makes a distinction between the concpetual "matrix" and the physical
  217. "array". However there are a number of places where this becomes fuzzy because of the overall
  218. bias towards FORTRAN's column major storage. The confusion is made worse by style differences
  219. between the level 2 and level 3 functions. It is amplified further by the explicit choice of row
  220. or column major storage in the C interface.
  221. The storage order does not affect the actual computation that is performed. That is, it does not
  222. affect the results other than where they appear in memory. It does affect the values passed
  223. for so-called "leading dimension" parameters, such as lda in sgemv. These are always the major
  224. stride in storage, allowing operations on rectangular subsets of larger matrices. For row major
  225. storage this is the number of columns in the parent matrix, and for column major storage this is
  226. the number of rows in the parent matrix.
  227. For the level 2 functions, which deal with only a single matrix, the matrix shape parameters are
  228. always M and N. These are the logical shape of the matrix, M rows by N columns. The transpose
  229. parameter, such as transA in sgemv, defines whether the regular matrix or its transpose is used
  230. in the operation. This affects the implicit length of the input and output vectors. For example,
  231. if the regular matrix A is used in sgemv, the input vector X has length N, the number of columns
  232. of A, and the output vector Y has length M, the number of rows of A. The length of the input and
  233. output vectors is not affected by the storage order of the matrix.
  234. The level 3 functions deal with 2 input matrices and one output matrix, the matrix shape parameters
  235. are M, N, and K. The logical shape of the output matrix is always M by N, while K is the common
  236. dimension of the input matrices. Like level 2, the transpose parameters, such as transA and transB
  237. in sgemm, define whether the regular input or its transpose is used in the operation. However
  238. unlike level 2, in level 3 the transpose parameters affect the implicit shape of the input matrix.
  239. Consider sgemm, which computes "C = (alpha * A * B) + (beta * C)", where A and B might be regular
  240. or transposed. The logical shape of C is always M rows by N columns. The physical shape depends
  241. on the storage order parameter. Using column major storage the declaration of C (the array) in C
  242. (the language) would be something like "float C[N][M]". The logical shape of A without transposition
  243. is M by K, and B is K by N. The one storage order parameter affects all three matrices.
  244. For those readers still wondering about the style differences between level 2 and level 3, they
  245. involve whether the input or output shapes are explicit. For level 2, the input matrix shape is
  246. always M by N. The input and output vector lengths are implicit and vary according to the
  247. transpose parameter. For level 3, the output matrix shape is always M by N. The input matrix
  248. shapes are implicit and vary according to the transpose parameters.
  249. =================================================================================================
  250. }
  251. { ==========================================================================================================================}
  252. {
  253. ------------------------------------------------------------------------------------------------------------------
  254. IsAlignedCount - True if an integer is positive and a multiple of 4. Negative strides are considered unaligned.
  255. IsAlignedAddr - True if an address is a multiple of 16.
  256. }
  257. // #define IsAlignedCount(n) ( (n > 0) && ((n & 3) == 0) )
  258. // #define IsAlignedAddr(a) ( ((long)a & 15L) == 0 )
  259. {
  260. =================================================================================================
  261. Prototypes for FORTRAN BLAS
  262. ===========================
  263. These are prototypes for the FORTRAN callable BLAS functions. They are implemented in C for
  264. Mac OS, as thin shims that simply call the C BLAS counterpart. These routines should never be
  265. called from C, but need to be included here so they will get output for the stub library. It
  266. won't hurt to call them from C, but who would want to since you can't pass literals for sizes?
  267. FORTRAN compilers are typically MPW tools and use PPCLink, so they will link with the official
  268. vecLib stub from Apple.
  269. =================================================================================================
  270. }
  271. {
  272. * SDOT()
  273. *
  274. * Availability:
  275. * Mac OS X: in version 10.0 and later in vecLib.framework
  276. * CarbonLib: not in Carbon, but vecLib is compatible with CarbonLib
  277. * Non-Carbon CFM: in vecLib 1.0.2 and later
  278. }
  279. function SDOT( (*const*) var N: SInt32; {const} X: Float32Ptr; (*const*) var incX: SInt32; {const} Y: Float32Ptr; (*const*) var incY: SInt32 ): Float32; external name '_SDOT';
  280. (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *)
  281. {
  282. * SNRM2()
  283. *
  284. * Availability:
  285. * Mac OS X: in version 10.0 and later in vecLib.framework
  286. * CarbonLib: not in Carbon, but vecLib is compatible with CarbonLib
  287. * Non-Carbon CFM: in vecLib 1.0.2 and later
  288. }
  289. function SNRM2( (*const*) var N: SInt32; {const} X: Float32Ptr; (*const*) var incX: SInt32 ): Float32; external name '_SNRM2';
  290. (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *)
  291. {
  292. * SASUM()
  293. *
  294. * Availability:
  295. * Mac OS X: in version 10.0 and later in vecLib.framework
  296. * CarbonLib: not in Carbon, but vecLib is compatible with CarbonLib
  297. * Non-Carbon CFM: in vecLib 1.0.2 and later
  298. }
  299. function SASUM( (*const*) var N: SInt32; {const} X: Float32Ptr; (*const*) var incX: SInt32 ): Float32; external name '_SASUM';
  300. (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *)
  301. {
  302. * ISAMAX()
  303. *
  304. * Availability:
  305. * Mac OS X: in version 10.0 and later in vecLib.framework
  306. * CarbonLib: not in Carbon, but vecLib is compatible with CarbonLib
  307. * Non-Carbon CFM: in vecLib 1.0.2 and later
  308. }
  309. function ISAMAX( (*const*) var N: SInt32; {const} X: Float32Ptr; (*const*) var incX: SInt32 ): SInt32; external name '_ISAMAX';
  310. (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *)
  311. {
  312. * SSWAP()
  313. *
  314. * Availability:
  315. * Mac OS X: in version 10.0 and later in vecLib.framework
  316. * CarbonLib: not in Carbon, but vecLib is compatible with CarbonLib
  317. * Non-Carbon CFM: in vecLib 1.0.2 and later
  318. }
  319. procedure SSWAP( (*const*) var N: SInt32; X: Float32Ptr; (*const*) var incX: SInt32; Y: Float32Ptr; (*const*) var incY: SInt32 ); external name '_SSWAP';
  320. (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *)
  321. {
  322. * SCOPY()
  323. *
  324. * Availability:
  325. * Mac OS X: in version 10.0 and later in vecLib.framework
  326. * CarbonLib: not in Carbon, but vecLib is compatible with CarbonLib
  327. * Non-Carbon CFM: in vecLib 1.0.2 and later
  328. }
  329. procedure SCOPY( (*const*) var N: SInt32; {const} X: Float32Ptr; (*const*) var incX: SInt32; Y: Float32Ptr; (*const*) var incY: SInt32 ); external name '_SCOPY';
  330. (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *)
  331. {
  332. * SAXPY()
  333. *
  334. * Availability:
  335. * Mac OS X: in version 10.0 and later in vecLib.framework
  336. * CarbonLib: not in Carbon, but vecLib is compatible with CarbonLib
  337. * Non-Carbon CFM: in vecLib 1.0.2 and later
  338. }
  339. procedure SAXPY( (*const*) var N: SInt32; const (*var*) alpha: Float32; {const} X: Float32Ptr; (*const*) var incX: SInt32; Y: Float32Ptr; (*const*) var incY: SInt32 ); external name '_SAXPY';
  340. (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *)
  341. {
  342. * SROT()
  343. *
  344. * Availability:
  345. * Mac OS X: in version 10.0 and later in vecLib.framework
  346. * CarbonLib: not in Carbon, but vecLib is compatible with CarbonLib
  347. * Non-Carbon CFM: in vecLib 1.0.2 and later
  348. }
  349. procedure SROT( (*const*) var N: SInt32; X: Float32Ptr; (*const*) var incX: SInt32; Y: Float32Ptr; (*const*) var incY: SInt32; const (*var*) c: Float32; const (*var*) s: Float32 ); external name '_SROT';
  350. (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *)
  351. {
  352. * SSCAL()
  353. *
  354. * Availability:
  355. * Mac OS X: in version 10.0 and later in vecLib.framework
  356. * CarbonLib: not in Carbon, but vecLib is compatible with CarbonLib
  357. * Non-Carbon CFM: in vecLib 1.0.2 and later
  358. }
  359. procedure SSCAL( (*const*) var N: SInt32; const (*var*) alpha: Float32; X: Float32Ptr; (*const*) var incX: SInt32 ); external name '_SSCAL';
  360. (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *)
  361. {
  362. * SGEMV()
  363. *
  364. * Availability:
  365. * Mac OS X: in version 10.0 and later in vecLib.framework
  366. * CarbonLib: not in Carbon, but vecLib is compatible with CarbonLib
  367. * Non-Carbon CFM: in vecLib 1.0.2 and later
  368. }
  369. procedure SGEMV( transA: ConstCStringPtr; (*const*) var M: SInt32; (*const*) var N: SInt32; const (*var*) alpha: Float32; {const} A: Float32Ptr; (*const*) var lda: SInt32; {const} X: Float32Ptr; (*const*) var incX: SInt32; const (*var*) beta: Float32; Y: Float32Ptr; (*const*) var incY: SInt32 ); external name '_SGEMV';
  370. (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *)
  371. {
  372. * SGEMM()
  373. *
  374. * Availability:
  375. * Mac OS X: in version 10.0 and later in vecLib.framework
  376. * CarbonLib: not in Carbon, but vecLib is compatible with CarbonLib
  377. * Non-Carbon CFM: in vecLib 1.0.2 and later
  378. }
  379. procedure SGEMM( transA: ConstCStringPtr; transB: ConstCStringPtr; (*const*) var M: SInt32; (*const*) var N: SInt32; (*const*) var K: SInt32; const (*var*) alpha: Float32; {const} A: Float32Ptr; (*const*) var lda: SInt32; {const} B: Float32Ptr; (*const*) var ldb: SInt32; const (*var*) beta: Float32; C: Float32Ptr; (*const*) var ldc: SInt32 ); external name '_SGEMM';
  380. (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *)
  381. { ==========================================================================================================================}
  382. { ==========================================================================================================================}
  383. {$endc} {TARGET_OS_MAC}
  384. {$ifc not defined MACOSALLINCLUDE or not MACOSALLINCLUDE}
  385. end.
  386. {$endc} {not MACOSALLINCLUDE}