1 /* 2 * -- High Performance Computing Linpack Benchmark (HPL) 3 * HPL - 2.3 - December 2, 2018 4 * Antoine P. Petitet 5 * University of Tennessee, Knoxville 6 * Innovative Computing Laboratory 7 * (C) Copyright 2000-2008 All Rights Reserved 8 * 9 * -- Copyright notice and Licensing terms: 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 15 * 1. Redistributions of source code must retain the above copyright 16 * notice, this list of conditions and the following disclaimer. 17 * 18 * 2. Redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions, and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution. 21 * 22 * 3. All advertising materials mentioning features or use of this 23 * software must display the following acknowledgement: 24 * This product includes software developed at the University of 25 * Tennessee, Knoxville, Innovative Computing Laboratory. 26 * 27 * 4. The name of the University, the name of the Laboratory, or the 28 * names of its contributors may not be used to endorse or promote 29 * products derived from this software without specific written 30 * permission. 31 * 32 * -- Disclaimer: 33 * 34 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 35 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 36 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 37 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY 38 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 39 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 40 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 41 * DATA OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 42 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 43 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 44 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 45 */ 46 #ifndef HPL_BLAS_H 47 #define HPL_BLAS_H 48 /* 49 * --------------------------------------------------------------------- 50 * Include files 51 * --------------------------------------------------------------------- 52 */ 53 #include "hpl_misc.h" 54 /* 55 * --------------------------------------------------------------------- 56 * typedef definitions 57 * --------------------------------------------------------------------- 58 */ 59 enum HPL_ORDER 60 { HplRowMajor = 101, HplColumnMajor = 102 }; 61 enum HPL_TRANS 62 { HplNoTrans = 111, HplTrans = 112, HplConjTrans = 113 }; 63 enum HPL_UPLO 64 { HplUpper = 121, HplLower = 122 }; 65 enum HPL_DIAG 66 { HplNonUnit = 131, HplUnit = 132 }; 67 enum HPL_SIDE 68 { HplLeft = 141, HplRight = 142 }; 69 70 #ifdef HPL_CALL_CBLAS 71 /* 72 * --------------------------------------------------------------------- 73 * The C interface of the BLAS is available ... 74 * --------------------------------------------------------------------- 75 * #define macro constants 76 * --------------------------------------------------------------------- 77 */ 78 #define CBLAS_INDEX int 79 80 #define CBLAS_ORDER HPL_ORDER 81 #define CblasRowMajor HplRowMajor 82 #define CblasColMajor HplColMajor 83 84 #define CBLAS_TRANSPOSE HPL_TRANS 85 #define CblasNoTrans HplNoTrans 86 #define CblasTrans HplTrans 87 #define CblasConjTrans HplConjTrans 88 89 #define CBLAS_UPLO HPL_UPLO 90 #define CblasUpper HplUpper 91 #define CblasLower HplLower 92 93 #define CBLAS_DIAG HPL_DIAG 94 #define CblasNonUnit HplNonUnit 95 #define CblasUnit HplUnit 96 97 #define CBLAS_SIDE HPL_SIDE 98 #define CblasLeft HplLeft 99 #define CblasRight HplRight 100 /* 101 * --------------------------------------------------------------------- 102 * CBLAS Function prototypes 103 * --------------------------------------------------------------------- 104 */ 105 CBLAS_INDEX cblas_idamax 106 STDC_ARGS( 107 ( const int, const double *, const int ) ); 108 void cblas_dswap 109 STDC_ARGS( 110 ( const int, double *, const int, double *, 111 const int ) ); 112 void cblas_dcopy 113 STDC_ARGS( 114 ( const int, const double *, const int, double *, 115 const int ) ); 116 void cblas_daxpy 117 STDC_ARGS( 118 ( const int, const double, const double *, const int, 119 double *, const int ) ); 120 void cblas_dscal 121 STDC_ARGS( 122 ( const int, const double, double *, const int ) ); 123 124 void cblas_dgemv 125 STDC_ARGS( 126 ( const enum CBLAS_ORDER, const enum CBLAS_TRANSPOSE, 127 const int, const int, const double, const double *, 128 const int, const double *, const int, const double, 129 double *, const int ) ); 130 131 void cblas_dger 132 STDC_ARGS( 133 ( const enum CBLAS_ORDER, const int, const int, 134 const double, const double *, const int, const double *, 135 const int, double *, const int ) ); 136 void cblas_dtrsv 137 STDC_ARGS( 138 ( const enum CBLAS_ORDER, const enum CBLAS_UPLO, 139 const enum CBLAS_TRANSPOSE, const enum CBLAS_DIAG, 140 const int, const double *, const int, double *, 141 const int ) ); 142 143 void cblas_dgemm 144 STDC_ARGS( 145 ( const enum CBLAS_ORDER, const enum CBLAS_TRANSPOSE, 146 const enum CBLAS_TRANSPOSE, const int, const int, 147 const int, const double, const double *, const int, 148 const double *, const int, const double, double *, 149 const int ) ); 150 void cblas_dtrsm 151 STDC_ARGS( 152 ( const enum CBLAS_ORDER, const enum CBLAS_SIDE, 153 const enum CBLAS_UPLO, const enum CBLAS_TRANSPOSE, 154 const enum CBLAS_DIAG, const int, const int, 155 const double, const double *, const int, double *, 156 const int ) ); 157 /* 158 * --------------------------------------------------------------------- 159 * HPL C BLAS macro definition 160 * --------------------------------------------------------------------- 161 */ 162 #define HPL_dswap cblas_dswap 163 #define HPL_dcopy cblas_dcopy 164 #define HPL_daxpy cblas_daxpy 165 #define HPL_dscal cblas_dscal 166 #define HPL_idamax cblas_idamax 167 168 #define HPL_dgemv cblas_dgemv 169 #define HPL_dtrsv cblas_dtrsv 170 #define HPL_dger cblas_dger 171 172 #define HPL_dgemm cblas_dgemm 173 #define HPL_dtrsm cblas_dtrsm 174 175 #endif 176 177 #ifdef HPL_CALL_FBLAS 178 /* 179 * --------------------------------------------------------------------- 180 * Use the Fortran 77 interface of the BLAS ... 181 * --------------------------------------------------------------------- 182 * Defaults: Add_, F77_INTEGER=int, StringSunStyle 183 * --------------------------------------------------------------------- 184 */ 185 #ifndef NoChange 186 #ifndef UpCase 187 #ifndef Add__ 188 #ifndef Add_ 189 190 #define Add_ 191 192 #endif 193 #endif 194 #endif 195 #endif 196 197 #ifndef F77_INTEGER 198 #define F77_INTEGER int 199 #else 200 #define HPL_USE_F77_INTEGER_DEF 201 #endif 202 203 #ifndef StringCrayStyle 204 #ifndef StringStructVal 205 #ifndef StringStructPtr 206 #ifndef StringSunStyle 207 208 #define StringSunStyle 209 210 #endif 211 #endif 212 #endif 213 #endif 214 /* 215 * --------------------------------------------------------------------- 216 * Fortran 77 <-> C interface 217 * --------------------------------------------------------------------- 218 * 219 * These macros identifies how Fortran routines will be called. 220 * 221 * Add_ : the Fortran compiler expects the name of C functions to be 222 * in all lower case and to have an underscore postfixed it (Suns, Intel 223 * compilers expect this). 224 * 225 * NoChange : the Fortran compiler expects the name of C functions to be 226 * in all lower case (IBM RS6K compilers do this). 227 * 228 * UpCase : the Fortran compiler expects the name of C functions to be 229 * in all upcase. (Cray compilers expect this). 230 * 231 * Add__ : the Fortran compiler in use is f2c, a Fortran to C conver- 232 * ter. 233 */ 234 #ifdef NoChange 235 /* 236 * These defines set up the naming scheme required to have a FORTRAN 237 * routine called by a C routine with the following FORTRAN to C inter- 238 * face: 239 * 240 * FORTRAN DECLARATION C CALL 241 * SUBROUTINE DGEMM(...) dgemm(...) 242 */ 243 #define F77dswap dswap 244 #define F77dscal dscal 245 #define F77dcopy dcopy 246 #define F77daxpy daxpy 247 #define F77idamax idamax 248 249 #define F77dgemv dgemv 250 #define F77dtrsv dtrsv 251 #define F77dger dger 252 253 #define F77dgemm dgemm 254 #define F77dtrsm dtrsm 255 256 #endif 257 258 #ifdef UpCase 259 /* 260 * These defines set up the naming scheme required to have a FORTRAN 261 * routine called by a C routine with the following FORTRAN to C inter- 262 * face: 263 * 264 * FORTRAN DECLARATION C CALL 265 * SUBROUTINE DGEMM(...) DGEMM(...) 266 */ 267 #ifdef CRAY_BLAS 268 269 #define F77dswap SSWAP 270 #define F77dscal SSCAL 271 #define F77dcopy SCOPY 272 #define F77daxpy SAXPY 273 #define F77idamax ISAMAX 274 275 #define F77dgemv SGEMV 276 #define F77dtrsv STRSV 277 #define F77dger SGER 278 279 #define F77dgemm SGEMM 280 #define F77dtrsm STRSM 281 282 #else 283 284 #define F77dswap DSWAP 285 #define F77dscal DSCAL 286 #define F77dcopy DCOPY 287 #define F77daxpy DAXPY 288 #define F77idamax IDAMAX 289 290 #define F77dgemv DGEMV 291 #define F77dtrsv DTRSV 292 #define F77dger DGER 293 294 #define F77dgemm DGEMM 295 #define F77dtrsm DTRSM 296 297 #endif 298 299 #endif 300 301 #ifdef Add_ 302 /* 303 * These defines set up the naming scheme required to have a FORTRAN 304 * routine called by a C routine with the following FORTRAN to C inter- 305 * face: 306 * 307 * FORTRAN DECLARATION C CALL 308 * SUBROUTINE DGEMM(...) dgemm_(...) 309 */ 310 #define F77dswap dswap_ 311 #define F77dscal dscal_ 312 #define F77dcopy dcopy_ 313 #define F77daxpy daxpy_ 314 #define F77idamax idamax_ 315 316 #define F77dgemv dgemv_ 317 #define F77dtrsv dtrsv_ 318 #define F77dger dger_ 319 320 #define F77dgemm dgemm_ 321 #define F77dtrsm dtrsm_ 322 323 #endif 324 325 #ifdef Add__ 326 /* 327 * These defines set up the naming scheme required to have a FORTRAN 328 * routine called by a C routine with the following FORTRAN to C inter- 329 * face: 330 * 331 * FORTRAN DECLARATION C CALL 332 * SUBROUTINE DGEMM(...) dgemm_(...) 333 */ 334 #define F77dswap dswap_ 335 #define F77dscal dscal_ 336 #define F77dcopy dcopy_ 337 #define F77daxpy daxpy_ 338 #define F77idamax idamax_ 339 340 #define F77dgemv dgemv_ 341 #define F77dtrsv dtrsv_ 342 #define F77dger dger_ 343 344 #define F77dgemm dgemm_ 345 #define F77dtrsm dtrsm_ 346 347 #endif 348 /* 349 * --------------------------------------------------------------------- 350 * Typedef definitions and conversion utilities 351 * --------------------------------------------------------------------- 352 */ 353 #ifdef StringCrayStyle 354 355 #include <fortran.h> 356 /* Type of character argument in a FORTRAN call */ 357 #define F77_CHAR _fcd 358 /* Character conversion utilities */ 359 #define HPL_F2C_CHAR(c) (*(_fcdtocp(c) )) 360 #define HPL_C2F_CHAR(c) (_cptofcd(&(c), 1)) 361 362 #define F77_CHAR_DECL F77_CHAR /* input CHARACTER*1 */ 363 364 #endif 365 /* ------------------------------------------------------------------ */ 366 #ifdef StringStructVal 367 /* Type of character argument in a FORTRAN call */ 368 typedef struct { char *cp; F77_INTEGER len; } F77_CHAR; 369 /* Character conversion utilities */ 370 #define HPL_F2C_CHAR(c) (*(c.cp)) 371 372 #define F77_CHAR_DECL F77_CHAR /* input CHARACTER*1 */ 373 374 #endif 375 /* ------------------------------------------------------------------ */ 376 #ifdef StringStructPtr 377 /* Type of character argument in a FORTRAN call */ 378 typedef struct { char *cp; F77_INTEGER len; } F77_CHAR; 379 /* Character conversion utilities */ 380 #define HPL_F2C_CHAR(c) (*(c->cp)) 381 382 #define F77_CHAR_DECL F77_CHAR * /* input CHARACTER*1 */ 383 384 #endif 385 /* ------------------------------------------------------------------ */ 386 #ifdef StringSunStyle 387 /* Type of character argument in a FORTRAN call */ 388 #define F77_CHAR char * 389 /* Character conversion utilities */ 390 #define HPL_F2C_CHAR(c) (*(c)) 391 #define HPL_C2F_CHAR(c) (&(c)) 392 393 #define F77_CHAR_DECL F77_CHAR /* input CHARACTER*1 */ 394 #define F77_1_CHAR , F77_INTEGER 395 #define F77_2_CHAR F77_1_CHAR F77_1_CHAR 396 #define F77_3_CHAR F77_2_CHAR F77_1_CHAR 397 #define F77_4_CHAR F77_3_CHAR F77_1_CHAR 398 399 #endif 400 /* ------------------------------------------------------------------ */ 401 402 #ifndef F77_1_CHAR 403 #define F77_1_CHAR 404 #define F77_2_CHAR 405 #define F77_3_CHAR 406 #define F77_4_CHAR 407 #endif 408 409 #define F77_INT_DECL const F77_INTEGER * /* input integer */ 410 #define F77_SIN_DECL const double * /* input scalar */ 411 #define F77_VIN_DECL const double * /* input vector */ 412 #define F77_VINOUT_DECL double * /* input/output matrix */ 413 #define F77_MIN_DECL const double * /* input matrix */ 414 #define F77_MINOUT_DECL double * /* input/output matrix */ 415 416 #ifdef CRAY_PVP_ENV /* Type of FORTRAN functions */ 417 #define F77_VOID_FUN extern fortran void /* subroutine */ 418 #define F77_INT_FUN extern fortran int /* integer function */ 419 #else 420 #define F77_VOID_FUN extern void /* subroutine */ 421 #define F77_INT_FUN extern int /* integer function */ 422 #endif 423 /* 424 * --------------------------------------------------------------------- 425 * Fortran 77 BLAS function prototypes 426 * --------------------------------------------------------------------- 427 */ 428 F77_VOID_FUN F77dswap 429 STDC_ARGS( 430 ( F77_INT_DECL, F77_VINOUT_DECL, F77_INT_DECL, F77_VINOUT_DECL, 431 F77_INT_DECL ) ); 432 F77_VOID_FUN F77dscal 433 STDC_ARGS( 434 ( F77_INT_DECL, F77_SIN_DECL, F77_VINOUT_DECL, F77_INT_DECL ) ); 435 F77_VOID_FUN F77dcopy 436 STDC_ARGS( 437 ( F77_INT_DECL, F77_VIN_DECL, F77_INT_DECL, F77_VINOUT_DECL, 438 F77_INT_DECL ) ); 439 F77_VOID_FUN F77daxpy 440 STDC_ARGS( 441 ( F77_INT_DECL, F77_SIN_DECL, F77_VIN_DECL, F77_INT_DECL, 442 F77_VINOUT_DECL, F77_INT_DECL ) ); 443 F77_INT_FUN F77idamax 444 STDC_ARGS( 445 ( F77_INT_DECL, F77_VIN_DECL, F77_INT_DECL ) ); 446 447 F77_VOID_FUN F77dgemv 448 STDC_ARGS( 449 ( F77_CHAR_DECL, F77_INT_DECL, F77_INT_DECL, F77_SIN_DECL, 450 F77_MIN_DECL, F77_INT_DECL, F77_VIN_DECL, F77_INT_DECL, 451 F77_SIN_DECL, F77_VINOUT_DECL, F77_INT_DECL F77_1_CHAR ) ); 452 F77_VOID_FUN F77dger 453 STDC_ARGS( 454 ( F77_INT_DECL, F77_INT_DECL, F77_SIN_DECL, F77_VIN_DECL, 455 F77_INT_DECL, F77_VIN_DECL, F77_INT_DECL, F77_MINOUT_DECL, 456 F77_INT_DECL ) ); 457 F77_VOID_FUN F77dtrsv 458 STDC_ARGS( 459 ( F77_CHAR_DECL, F77_CHAR_DECL, F77_CHAR_DECL, F77_INT_DECL, 460 F77_MIN_DECL, F77_INT_DECL, F77_VINOUT_DECL, F77_INT_DECL 461 F77_3_CHAR ) ); 462 463 F77_VOID_FUN F77dgemm 464 STDC_ARGS( 465 ( F77_CHAR_DECL, F77_CHAR_DECL, F77_INT_DECL, F77_INT_DECL, 466 F77_INT_DECL, F77_SIN_DECL, F77_MIN_DECL, F77_INT_DECL, 467 F77_MIN_DECL, F77_INT_DECL, F77_SIN_DECL, F77_MINOUT_DECL, 468 F77_INT_DECL F77_2_CHAR ) ); 469 F77_VOID_FUN F77dtrsm 470 STDC_ARGS( 471 ( F77_CHAR_DECL, F77_CHAR_DECL, F77_CHAR_DECL, F77_CHAR_DECL, 472 F77_INT_DECL, F77_INT_DECL, F77_SIN_DECL, F77_MIN_DECL, 473 F77_INT_DECL, F77_MINOUT_DECL, F77_INT_DECL F77_4_CHAR ) ); 474 475 #endif 476 /* 477 * --------------------------------------------------------------------- 478 * HPL BLAS Function prototypes 479 * --------------------------------------------------------------------- 480 */ 481 #ifndef HPL_CALL_CBLAS 482 483 int HPL_idamax 484 STDC_ARGS( ( 485 const int, 486 const double *, 487 const int 488 ) ); 489 void HPL_daxpy 490 STDC_ARGS( ( 491 const int, 492 const double, 493 const double *, 494 const int, 495 double *, 496 const int 497 ) ); 498 void HPL_dcopy 499 STDC_ARGS( ( 500 const int, 501 const double *, 502 const int, 503 double *, 504 const int 505 ) ); 506 void HPL_dscal 507 STDC_ARGS( ( 508 const int, 509 const double, 510 double *, 511 const int 512 ) ); 513 void HPL_dswap 514 STDC_ARGS( ( 515 const int, 516 double *, 517 const int, 518 double *, 519 const int 520 ) ); 521 void HPL_dgemv 522 STDC_ARGS( ( 523 const enum HPL_ORDER, 524 const enum HPL_TRANS, 525 const int, 526 const int, 527 const double, 528 const double *, 529 const int, 530 const double *, 531 const int, 532 const double, 533 double *, 534 const int 535 ) ); 536 void HPL_dger 537 STDC_ARGS( ( 538 const enum HPL_ORDER, 539 const int, 540 const int, 541 const double, 542 const double *, 543 const int, 544 double *, 545 const int, 546 double *, 547 const int 548 ) ); 549 void HPL_dtrsv 550 STDC_ARGS( ( 551 const enum HPL_ORDER, 552 const enum HPL_UPLO, 553 const enum HPL_TRANS, 554 const enum HPL_DIAG, 555 const int, 556 const double *, 557 const int, 558 double *, 559 const int 560 ) ); 561 void HPL_dgemm 562 STDC_ARGS( ( 563 const enum HPL_ORDER, 564 const enum HPL_TRANS, 565 const enum HPL_TRANS, 566 const int, 567 const int, 568 const int, 569 const double, 570 const double *, 571 const int, 572 const double *, 573 const int, 574 const double, 575 double *, 576 const int 577 ) ); 578 void HPL_dtrsm 579 STDC_ARGS( ( 580 const enum HPL_ORDER, 581 const enum HPL_SIDE, 582 const enum HPL_UPLO, 583 const enum HPL_TRANS, 584 const enum HPL_DIAG, 585 const int, 586 const int, 587 const double, 588 const double *, 589 const int, 590 double *, 591 const int 592 ) ); 593 594 #endif 595 596 #endif 597 /* 598 * hpl_blas.h 599 */ 600