You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.html 43 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899
  1. <!doctype html>
  2. <html lang="en" class="no-js">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width,initial-scale=1">
  6. <link rel="canonical" href="https://openblas.net/docs/user_manual/">
  7. <link rel="prev" href="../install/">
  8. <link rel="next" href="../extensions/">
  9. <link rel="icon" href="../logo.svg">
  10. <meta name="generator" content="mkdocs-1.6.0, mkdocs-material-9.5.26">
  11. <title>User manual - OpenBLAS</title>
  12. <link rel="stylesheet" href="../assets/stylesheets/main.6543a935.min.css">
  13. <link rel="stylesheet" href="../assets/stylesheets/palette.06af60db.min.css">
  14. <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  15. <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
  16. <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
  17. <script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
  18. </head>
  19. <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="grey" data-md-color-accent="indigo">
  20. <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
  21. <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
  22. <label class="md-overlay" for="__drawer"></label>
  23. <div data-md-component="skip">
  24. <a href="#compile-the-library" class="md-skip">
  25. Skip to content
  26. </a>
  27. </div>
  28. <div data-md-component="announce">
  29. </div>
  30. <header class="md-header md-header--shadow" data-md-component="header">
  31. <nav class="md-header__inner md-grid" aria-label="Header">
  32. <a href=".." title="OpenBLAS" class="md-header__button md-logo" aria-label="OpenBLAS" data-md-component="logo">
  33. <img src="../logo.svg" alt="logo">
  34. </a>
  35. <label class="md-header__button md-icon" for="__drawer">
  36. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
  37. </label>
  38. <div class="md-header__title" data-md-component="header-title">
  39. <div class="md-header__ellipsis">
  40. <div class="md-header__topic">
  41. <span class="md-ellipsis">
  42. OpenBLAS
  43. </span>
  44. </div>
  45. <div class="md-header__topic" data-md-component="header-topic">
  46. <span class="md-ellipsis">
  47. User manual
  48. </span>
  49. </div>
  50. </div>
  51. </div>
  52. <label class="md-header__button md-icon" for="__search">
  53. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
  54. </label>
  55. <div class="md-search" data-md-component="search" role="dialog">
  56. <label class="md-search__overlay" for="__search"></label>
  57. <div class="md-search__inner" role="search">
  58. <form class="md-search__form" name="search">
  59. <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
  60. <label class="md-search__icon md-icon" for="__search">
  61. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
  62. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
  63. </label>
  64. <nav class="md-search__options" aria-label="Search">
  65. <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
  66. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
  67. </button>
  68. </nav>
  69. </form>
  70. <div class="md-search__output">
  71. <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
  72. <div class="md-search-result" data-md-component="search-result">
  73. <div class="md-search-result__meta">
  74. Initializing search
  75. </div>
  76. <ol class="md-search-result__list" role="presentation"></ol>
  77. </div>
  78. </div>
  79. </div>
  80. </div>
  81. </div>
  82. </nav>
  83. </header>
  84. <div class="md-container" data-md-component="container">
  85. <main class="md-main" data-md-component="main">
  86. <div class="md-main__inner md-grid">
  87. <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
  88. <div class="md-sidebar__scrollwrap">
  89. <div class="md-sidebar__inner">
  90. <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
  91. <label class="md-nav__title" for="__drawer">
  92. <a href=".." title="OpenBLAS" class="md-nav__button md-logo" aria-label="OpenBLAS" data-md-component="logo">
  93. <img src="../logo.svg" alt="logo">
  94. </a>
  95. OpenBLAS
  96. </label>
  97. <ul class="md-nav__list" data-md-scrollfix>
  98. <li class="md-nav__item">
  99. <a href=".." class="md-nav__link">
  100. <span class="md-ellipsis">
  101. Home
  102. </span>
  103. </a>
  104. </li>
  105. <li class="md-nav__item">
  106. <a href="../install/" class="md-nav__link">
  107. <span class="md-ellipsis">
  108. Install OpenBLAS
  109. </span>
  110. </a>
  111. </li>
  112. <li class="md-nav__item md-nav__item--active">
  113. <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
  114. <label class="md-nav__link md-nav__link--active" for="__toc">
  115. <span class="md-ellipsis">
  116. User manual
  117. </span>
  118. <span class="md-nav__icon md-icon"></span>
  119. </label>
  120. <a href="./" class="md-nav__link md-nav__link--active">
  121. <span class="md-ellipsis">
  122. User manual
  123. </span>
  124. </a>
  125. <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
  126. <label class="md-nav__title" for="__toc">
  127. <span class="md-nav__icon md-icon"></span>
  128. Table of contents
  129. </label>
  130. <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
  131. <li class="md-nav__item">
  132. <a href="#compile-the-library" class="md-nav__link">
  133. <span class="md-ellipsis">
  134. Compile the library
  135. </span>
  136. </a>
  137. <nav class="md-nav" aria-label="Compile the library">
  138. <ul class="md-nav__list">
  139. <li class="md-nav__item">
  140. <a href="#normal-compile" class="md-nav__link">
  141. <span class="md-ellipsis">
  142. Normal compile
  143. </span>
  144. </a>
  145. </li>
  146. <li class="md-nav__item">
  147. <a href="#cross-compile" class="md-nav__link">
  148. <span class="md-ellipsis">
  149. Cross compile
  150. </span>
  151. </a>
  152. </li>
  153. <li class="md-nav__item">
  154. <a href="#debug-version" class="md-nav__link">
  155. <span class="md-ellipsis">
  156. Debug version
  157. </span>
  158. </a>
  159. </li>
  160. <li class="md-nav__item">
  161. <a href="#install-to-the-directory-optional" class="md-nav__link">
  162. <span class="md-ellipsis">
  163. Install to the directory (optional)
  164. </span>
  165. </a>
  166. </li>
  167. </ul>
  168. </nav>
  169. </li>
  170. <li class="md-nav__item">
  171. <a href="#link-the-library" class="md-nav__link">
  172. <span class="md-ellipsis">
  173. Link the library
  174. </span>
  175. </a>
  176. </li>
  177. <li class="md-nav__item">
  178. <a href="#code-examples" class="md-nav__link">
  179. <span class="md-ellipsis">
  180. Code examples
  181. </span>
  182. </a>
  183. <nav class="md-nav" aria-label="Code examples">
  184. <ul class="md-nav__list">
  185. <li class="md-nav__item">
  186. <a href="#call-cblas-interface" class="md-nav__link">
  187. <span class="md-ellipsis">
  188. Call CBLAS interface
  189. </span>
  190. </a>
  191. </li>
  192. <li class="md-nav__item">
  193. <a href="#call-blas-fortran-interface" class="md-nav__link">
  194. <span class="md-ellipsis">
  195. Call BLAS Fortran interface
  196. </span>
  197. </a>
  198. </li>
  199. </ul>
  200. </nav>
  201. </li>
  202. <li class="md-nav__item">
  203. <a href="#troubleshooting" class="md-nav__link">
  204. <span class="md-ellipsis">
  205. Troubleshooting
  206. </span>
  207. </a>
  208. </li>
  209. <li class="md-nav__item">
  210. <a href="#blas-reference-manual" class="md-nav__link">
  211. <span class="md-ellipsis">
  212. BLAS reference manual
  213. </span>
  214. </a>
  215. </li>
  216. </ul>
  217. </nav>
  218. </li>
  219. <li class="md-nav__item">
  220. <a href="../extensions/" class="md-nav__link">
  221. <span class="md-ellipsis">
  222. Extensions
  223. </span>
  224. </a>
  225. </li>
  226. <li class="md-nav__item">
  227. <a href="../developers/" class="md-nav__link">
  228. <span class="md-ellipsis">
  229. Developer manual
  230. </span>
  231. </a>
  232. </li>
  233. <li class="md-nav__item">
  234. <a href="../build_system/" class="md-nav__link">
  235. <span class="md-ellipsis">
  236. Build system
  237. </span>
  238. </a>
  239. </li>
  240. <li class="md-nav__item">
  241. <a href="../distributing/" class="md-nav__link">
  242. <span class="md-ellipsis">
  243. Redistributing OpenBLAS
  244. </span>
  245. </a>
  246. </li>
  247. <li class="md-nav__item">
  248. <a href="../ci/" class="md-nav__link">
  249. <span class="md-ellipsis">
  250. CI jobs
  251. </span>
  252. </a>
  253. </li>
  254. <li class="md-nav__item">
  255. <a href="../about/" class="md-nav__link">
  256. <span class="md-ellipsis">
  257. About
  258. </span>
  259. </a>
  260. </li>
  261. <li class="md-nav__item">
  262. <a href="../faq/" class="md-nav__link">
  263. <span class="md-ellipsis">
  264. FAQ
  265. </span>
  266. </a>
  267. </li>
  268. </ul>
  269. </nav>
  270. </div>
  271. </div>
  272. </div>
  273. <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
  274. <div class="md-sidebar__scrollwrap">
  275. <div class="md-sidebar__inner">
  276. <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
  277. <label class="md-nav__title" for="__toc">
  278. <span class="md-nav__icon md-icon"></span>
  279. Table of contents
  280. </label>
  281. <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
  282. <li class="md-nav__item">
  283. <a href="#compile-the-library" class="md-nav__link">
  284. <span class="md-ellipsis">
  285. Compile the library
  286. </span>
  287. </a>
  288. <nav class="md-nav" aria-label="Compile the library">
  289. <ul class="md-nav__list">
  290. <li class="md-nav__item">
  291. <a href="#normal-compile" class="md-nav__link">
  292. <span class="md-ellipsis">
  293. Normal compile
  294. </span>
  295. </a>
  296. </li>
  297. <li class="md-nav__item">
  298. <a href="#cross-compile" class="md-nav__link">
  299. <span class="md-ellipsis">
  300. Cross compile
  301. </span>
  302. </a>
  303. </li>
  304. <li class="md-nav__item">
  305. <a href="#debug-version" class="md-nav__link">
  306. <span class="md-ellipsis">
  307. Debug version
  308. </span>
  309. </a>
  310. </li>
  311. <li class="md-nav__item">
  312. <a href="#install-to-the-directory-optional" class="md-nav__link">
  313. <span class="md-ellipsis">
  314. Install to the directory (optional)
  315. </span>
  316. </a>
  317. </li>
  318. </ul>
  319. </nav>
  320. </li>
  321. <li class="md-nav__item">
  322. <a href="#link-the-library" class="md-nav__link">
  323. <span class="md-ellipsis">
  324. Link the library
  325. </span>
  326. </a>
  327. </li>
  328. <li class="md-nav__item">
  329. <a href="#code-examples" class="md-nav__link">
  330. <span class="md-ellipsis">
  331. Code examples
  332. </span>
  333. </a>
  334. <nav class="md-nav" aria-label="Code examples">
  335. <ul class="md-nav__list">
  336. <li class="md-nav__item">
  337. <a href="#call-cblas-interface" class="md-nav__link">
  338. <span class="md-ellipsis">
  339. Call CBLAS interface
  340. </span>
  341. </a>
  342. </li>
  343. <li class="md-nav__item">
  344. <a href="#call-blas-fortran-interface" class="md-nav__link">
  345. <span class="md-ellipsis">
  346. Call BLAS Fortran interface
  347. </span>
  348. </a>
  349. </li>
  350. </ul>
  351. </nav>
  352. </li>
  353. <li class="md-nav__item">
  354. <a href="#troubleshooting" class="md-nav__link">
  355. <span class="md-ellipsis">
  356. Troubleshooting
  357. </span>
  358. </a>
  359. </li>
  360. <li class="md-nav__item">
  361. <a href="#blas-reference-manual" class="md-nav__link">
  362. <span class="md-ellipsis">
  363. BLAS reference manual
  364. </span>
  365. </a>
  366. </li>
  367. </ul>
  368. </nav>
  369. </div>
  370. </div>
  371. </div>
  372. <div class="md-content" data-md-component="content">
  373. <article class="md-content__inner md-typeset">
  374. <h1>User manual</h1>
  375. <h2 id="compile-the-library">Compile the library</h2>
  376. <h3 id="normal-compile">Normal compile</h3>
  377. <ul>
  378. <li>type <code>make</code> to detect the CPU automatically.
  379. or</li>
  380. <li>type <code>make TARGET=xxx</code> to set target CPU, e.g. <code>make TARGET=NEHALEM</code>. The full target list is in file TargetList.txt.</li>
  381. </ul>
  382. <h3 id="cross-compile">Cross compile</h3>
  383. <p>Please set <code>CC</code> and <code>FC</code> with the cross toolchains. Then, set <code>HOSTCC</code> with your host C compiler. At last, set <code>TARGET</code> explicitly.</p>
  384. <p>Examples:</p>
  385. <ul>
  386. <li>On x86 box, compile the library for ARM Cortex-A9 linux.</li>
  387. </ul>
  388. <p>Install only gnueabihf versions. Please check https://github.com/xianyi/OpenBLAS/issues/936#issuecomment-237596847</p>
  389. <pre><code>make CC=arm-linux-gnueabihf-gcc FC=arm-linux-gnueabihf-gfortran HOSTCC=gcc TARGET=CORTEXA9
  390. </code></pre>
  391. <ul>
  392. <li>On X86 box, compile this library for loongson3a CPU.</li>
  393. </ul>
  394. <div class="highlight"><pre><span></span><code>make BINARY=64 CC=mips64el-unknown-linux-gnu-gcc FC=mips64el-unknown-linux-gnu-gfortran HOSTCC=gcc TARGET=LOONGSON3A
  395. </code></pre></div>
  396. <ul>
  397. <li>On X86 box, compile this library for loongson3a CPU with loongcc (based on Open64) compiler.</li>
  398. </ul>
  399. <div class="highlight"><pre><span></span><code>make CC=loongcc FC=loongf95 HOSTCC=gcc TARGET=LOONGSON3A CROSS=1 CROSS_SUFFIX=mips64el-st-linux-gnu- NO_LAPACKE=1 NO_SHARED=1 BINARY=32
  400. </code></pre></div>
  401. <h3 id="debug-version">Debug version</h3>
  402. <pre><code>make DEBUG=1
  403. </code></pre>
  404. <h3 id="install-to-the-directory-optional">Install to the directory (optional)</h3>
  405. <p>Example:</p>
  406. <pre><code>make install PREFIX=your_installation_directory
  407. </code></pre>
  408. <p>The default directory is /opt/OpenBLAS. Note that any flags passed to <code>make</code> during build should also be passed to <code>make install</code> to circumvent any install errors, i.e. some headers not being copied over correctly.</p>
  409. <p>For more information, please read <a href="../install/">Installation Guide</a>.</p>
  410. <h2 id="link-the-library">Link the library</h2>
  411. <ul>
  412. <li>Link shared library</li>
  413. </ul>
  414. <div class="highlight"><pre><span></span><code>gcc -o test test.c -I/your_path/OpenBLAS/include/ -L/your_path/OpenBLAS/lib -Wl,-rpath,/your_path/OpenBLAS/lib -lopenblas
  415. </code></pre></div>
  416. <p>The <code>-Wl,-rpath,/your_path/OpenBLAS/lib</code> option to linker can be omitted if you ran <code>ldconfig</code> to update linker cache, put <code>/your_path/OpenBLAS/lib</code> in <code>/etc/ld.so.conf</code> or a file in <code>/etc/ld.so.conf.d</code>, or installed OpenBLAS in a location that is part of the <code>ld.so</code> default search path (usually /lib,/usr/lib and /usr/local/lib). Alternatively, you can set the environment variable LD_LIBRARY_PATH to point to the folder that contains libopenblas.so. Otherwise, linking at runtime will fail with a message like <code>cannot open shared object file: no such file or directory</code></p>
  417. <p>If the library is multithreaded, please add <code>-lpthread</code>. If the library contains LAPACK functions, please add <code>-lgfortran</code> or other Fortran libs, although if you only make calls to LAPACKE routines, i.e. your code has <code>#include "lapacke.h"</code> and makes calls to methods like <code>LAPACKE_dgeqrf</code>, <code>-lgfortran</code> is not needed.</p>
  418. <ul>
  419. <li>Link static library</li>
  420. </ul>
  421. <div class="highlight"><pre><span></span><code>gcc -o test test.c /your/path/libopenblas.a
  422. </code></pre></div>
  423. <p>You can download <code>test.c</code> from https://gist.github.com/xianyi/5780018 </p>
  424. <h2 id="code-examples">Code examples</h2>
  425. <h3 id="call-cblas-interface">Call CBLAS interface</h3>
  426. <p>This example shows calling cblas_dgemm in C. https://gist.github.com/xianyi/6930656
  427. <div class="highlight"><pre><span></span><code><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;cblas.h&gt;</span>
  428. <span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdio.h&gt;</span>
  429. <span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span>
  430. <span class="p">{</span>
  431. <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
  432. <span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">A</span><span class="p">[</span><span class="mi">6</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mf">1.0</span><span class="p">,</span><span class="mf">2.0</span><span class="p">,</span><span class="mf">1.0</span><span class="p">,</span><span class="mf">-3.0</span><span class="p">,</span><span class="mf">4.0</span><span class="p">,</span><span class="mf">-1.0</span><span class="p">};</span><span class="w"> </span>
  433. <span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">B</span><span class="p">[</span><span class="mi">6</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mf">1.0</span><span class="p">,</span><span class="mf">2.0</span><span class="p">,</span><span class="mf">1.0</span><span class="p">,</span><span class="mf">-3.0</span><span class="p">,</span><span class="mf">4.0</span><span class="p">,</span><span class="mf">-1.0</span><span class="p">};</span><span class="w"> </span>
  434. <span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">C</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mf">.5</span><span class="p">,</span><span class="mf">.5</span><span class="p">,</span><span class="mf">.5</span><span class="p">,</span><span class="mf">.5</span><span class="p">,</span><span class="mf">.5</span><span class="p">,</span><span class="mf">.5</span><span class="p">,</span><span class="mf">.5</span><span class="p">,</span><span class="mf">.5</span><span class="p">,</span><span class="mf">.5</span><span class="p">};</span><span class="w"> </span>
  435. <span class="w"> </span><span class="n">cblas_dgemm</span><span class="p">(</span><span class="n">CblasColMajor</span><span class="p">,</span><span class="w"> </span><span class="n">CblasNoTrans</span><span class="p">,</span><span class="w"> </span><span class="n">CblasTrans</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="n">A</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="n">C</span><span class="p">,</span><span class="mi">3</span><span class="p">);</span>
  436. <span class="w"> </span><span class="k">for</span><span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">&lt;</span><span class="mi">9</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span>
  437. <span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;%lf &quot;</span><span class="p">,</span><span class="w"> </span><span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
  438. <span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>
  439. <span class="p">}</span>
  440. </code></pre></div></p>
  441. <div class="highlight"><pre><span></span><code>gcc -o test_cblas_open test_cblas_dgemm.c -I /your_path/OpenBLAS/include/ -L/your_path/OpenBLAS/lib -lopenblas -lpthread -lgfortran
  442. </code></pre></div>
  443. <h3 id="call-blas-fortran-interface">Call BLAS Fortran interface</h3>
  444. <p>This example shows calling dgemm Fortran interface in C. https://gist.github.com/xianyi/5780018</p>
  445. <div class="highlight"><pre><span></span><code><span class="cp">#include</span><span class="w"> </span><span class="cpf">&quot;stdio.h&quot;</span>
  446. <span class="cp">#include</span><span class="w"> </span><span class="cpf">&quot;stdlib.h&quot;</span>
  447. <span class="cp">#include</span><span class="w"> </span><span class="cpf">&quot;sys/time.h&quot;</span>
  448. <span class="cp">#include</span><span class="w"> </span><span class="cpf">&quot;time.h&quot;</span>
  449. <span class="k">extern</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">dgemm_</span><span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="o">*</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="o">*</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="o">*</span><span class="p">,</span><span class="kt">int</span><span class="o">*</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="o">*</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="o">*</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="o">*</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="o">*</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="o">*</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="o">*</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="o">*</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="o">*</span><span class="p">);</span>
  450. <span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="o">*</span><span class="w"> </span><span class="n">argv</span><span class="p">[])</span>
  451. <span class="p">{</span>
  452. <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">;</span>
  453. <span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;test!</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>
  454. <span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">argc</span><span class="o">&lt;</span><span class="mi">4</span><span class="p">){</span>
  455. <span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Input Error</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>
  456. <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
  457. <span class="w"> </span><span class="p">}</span>
  458. <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
  459. <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">]);</span>
  460. <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">3</span><span class="p">]);</span>
  461. <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">sizeofa</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">k</span><span class="p">;</span>
  462. <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">sizeofb</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">n</span><span class="p">;</span>
  463. <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">sizeofc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">n</span><span class="p">;</span>
  464. <span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">ta</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="sc">&#39;N&#39;</span><span class="p">;</span>
  465. <span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">tb</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="sc">&#39;N&#39;</span><span class="p">;</span>
  466. <span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">alpha</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">1.2</span><span class="p">;</span>
  467. <span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">beta</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0.001</span><span class="p">;</span>
  468. <span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">timeval</span><span class="w"> </span><span class="n">start</span><span class="p">,</span><span class="n">finish</span><span class="p">;</span>
  469. <span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">duration</span><span class="p">;</span>
  470. <span class="w"> </span><span class="kt">double</span><span class="o">*</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">double</span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">sizeofa</span><span class="p">);</span>
  471. <span class="w"> </span><span class="kt">double</span><span class="o">*</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">double</span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">sizeofb</span><span class="p">);</span>
  472. <span class="w"> </span><span class="kt">double</span><span class="o">*</span><span class="w"> </span><span class="n">C</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">double</span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">sizeofc</span><span class="p">);</span>
  473. <span class="w"> </span><span class="n">srand</span><span class="p">((</span><span class="kt">unsigned</span><span class="p">)</span><span class="n">time</span><span class="p">(</span><span class="nb">NULL</span><span class="p">));</span>
  474. <span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">&lt;</span><span class="n">sizeofa</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span>
  475. <span class="w"> </span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">i</span><span class="o">%</span><span class="mi">3</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span><span class="c1">//(rand()%100)/10.0;</span>
  476. <span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">&lt;</span><span class="n">sizeofb</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span>
  477. <span class="w"> </span><span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">i</span><span class="o">%</span><span class="mi">3</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span><span class="c1">//(rand()%100)/10.0;</span>
  478. <span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">&lt;</span><span class="n">sizeofc</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span>
  479. <span class="w"> </span><span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">i</span><span class="o">%</span><span class="mi">3</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span><span class="c1">//(rand()%100)/10.0;</span>
  480. <span class="w"> </span><span class="c1">//#if 0</span>
  481. <span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;m=%d,n=%d,k=%d,alpha=%lf,beta=%lf,sizeofc=%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="n">m</span><span class="p">,</span><span class="n">n</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">alpha</span><span class="p">,</span><span class="n">beta</span><span class="p">,</span><span class="n">sizeofc</span><span class="p">);</span>
  482. <span class="w"> </span><span class="n">gettimeofday</span><span class="p">(</span><span class="o">&amp;</span><span class="n">start</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>
  483. <span class="w"> </span><span class="n">dgemm_</span><span class="p">(</span><span class="o">&amp;</span><span class="n">ta</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">tb</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">m</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">n</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">k</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">alpha</span><span class="p">,</span><span class="w"> </span><span class="n">A</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">m</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">k</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">beta</span><span class="p">,</span><span class="w"> </span><span class="n">C</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">m</span><span class="p">);</span>
  484. <span class="w"> </span><span class="n">gettimeofday</span><span class="p">(</span><span class="o">&amp;</span><span class="n">finish</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>
  485. <span class="w"> </span><span class="n">duration</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">((</span><span class="kt">double</span><span class="p">)(</span><span class="n">finish</span><span class="p">.</span><span class="n">tv_sec</span><span class="o">-</span><span class="n">start</span><span class="p">.</span><span class="n">tv_sec</span><span class="p">)</span><span class="o">*</span><span class="mi">1000000</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">(</span><span class="kt">double</span><span class="p">)(</span><span class="n">finish</span><span class="p">.</span><span class="n">tv_usec</span><span class="o">-</span><span class="n">start</span><span class="p">.</span><span class="n">tv_usec</span><span class="p">))</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mi">1000000</span><span class="p">;</span>
  486. <span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">gflops</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">2.0</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">*</span><span class="n">n</span><span class="o">*</span><span class="n">k</span><span class="p">;</span>
  487. <span class="w"> </span><span class="n">gflops</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gflops</span><span class="o">/</span><span class="n">duration</span><span class="o">*</span><span class="mf">1.0e-6</span><span class="p">;</span>
  488. <span class="w"> </span><span class="kt">FILE</span><span class="w"> </span><span class="o">*</span><span class="n">fp</span><span class="p">;</span>
  489. <span class="w"> </span><span class="n">fp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fopen</span><span class="p">(</span><span class="s">&quot;timeDGEMM.txt&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;a&quot;</span><span class="p">);</span>
  490. <span class="w"> </span><span class="n">fprintf</span><span class="p">(</span><span class="n">fp</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;%dx%dx%d</span><span class="se">\t</span><span class="s">%lf s</span><span class="se">\t</span><span class="s">%lf MFLOPS</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">m</span><span class="p">,</span><span class="w"> </span><span class="n">n</span><span class="p">,</span><span class="w"> </span><span class="n">k</span><span class="p">,</span><span class="w"> </span><span class="n">duration</span><span class="p">,</span><span class="w"> </span><span class="n">gflops</span><span class="p">);</span>
  491. <span class="w"> </span><span class="n">fclose</span><span class="p">(</span><span class="n">fp</span><span class="p">);</span>
  492. <span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">A</span><span class="p">);</span>
  493. <span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">B</span><span class="p">);</span>
  494. <span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">C</span><span class="p">);</span>
  495. <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
  496. <span class="p">}</span>
  497. </code></pre></div>
  498. <div class="highlight"><pre><span></span><code>gcc -o time_dgemm time_dgemm.c /your/path/libopenblas.a -lpthread
  499. ./time_dgemm &lt;m&gt; &lt;n&gt; &lt;k&gt;
  500. </code></pre></div>
  501. <h2 id="troubleshooting">Troubleshooting</h2>
  502. <ul>
  503. <li>Please read <a href="../faq/">Faq</a> at first.</li>
  504. <li>Please use gcc version 4.6 and above to compile Sandy Bridge AVX kernels on Linux/MingW/BSD.</li>
  505. <li>Please use Clang version 3.1 and above to compile the library on Sandy Bridge microarchitecture. The Clang 3.0 will generate the wrong AVX binary code.</li>
  506. <li>The number of CPUs/Cores should less than or equal to 256. On Linux x86_64(amd64), there is experimental support for up to 1024 CPUs/Cores and 128 numa nodes if you build the library with BIGNUMA=1.</li>
  507. <li>OpenBLAS does not set processor affinity by default. On Linux, you can enable processor affinity by commenting the line NO_AFFINITY=1 in Makefile.rule. But this may cause <a href="https://stat.ethz.ch/pipermail/r-sig-hpc/2012-April/001348.html">the conflict with R parallel</a>.</li>
  508. <li>On Loongson 3A. make test would be failed because of pthread_create error. The error code is EAGAIN. However, it will be OK when you run the same testcase on shell.</li>
  509. </ul>
  510. <h2 id="blas-reference-manual">BLAS reference manual</h2>
  511. <p>If you want to understand every BLAS function and definition, please read <a href="https://software.intel.com/en-us/intel-mkl/documentation">Intel MKL reference manual</a> or <a href="http://netlib.org/blas/">netlib.org</a></p>
  512. <p>Here are <a href="../extensions/">OpenBLAS extension functions</a></p>
  513. </article>
  514. </div>
  515. <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
  516. </div>
  517. </main>
  518. <footer class="md-footer">
  519. <div class="md-footer-meta md-typeset">
  520. <div class="md-footer-meta__inner md-grid">
  521. <div class="md-copyright">
  522. Made with
  523. <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
  524. Material for MkDocs
  525. </a>
  526. </div>
  527. </div>
  528. </div>
  529. </footer>
  530. </div>
  531. <div class="md-dialog" data-md-component="dialog">
  532. <div class="md-dialog__inner md-typeset"></div>
  533. </div>
  534. <script id="__config" type="application/json">{"base": "..", "features": [], "search": "../assets/javascripts/workers/search.b8dbb3d2.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
  535. <script src="../assets/javascripts/bundle.ad660dcc.min.js"></script>
  536. </body>
  537. </html>

OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version.