README
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:8k
源码类别:

数学计算

开发平台:

Unix_Linux

  1. Copyright 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software
  2. Foundation, Inc.
  3. This file is part of the GNU MP Library.
  4. The GNU MP Library is free software; you can redistribute it and/or modify it
  5. under the terms of the GNU Lesser General Public License as published by the
  6. Free Software Foundation; either version 3 of the License, or (at your
  7. option) any later version.
  8. The GNU MP Library is distributed in the hope that it will be useful, but
  9. WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10. FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
  11. for more details.
  12. You should have received a copy of the GNU Lesser General Public License along
  13. with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  14. This directory contains mpn functions optimized for DEC Alpha processors.
  15. ALPHA ASSEMBLY RULES AND REGULATIONS
  16. The `.prologue N' pseudo op marks the end of instruction that needs special
  17. handling by unwinding.  It also says whether $27 is really needed for computing
  18. the gp.  The `.mask M' pseudo op says which registers are saved on the stack,
  19. and at what offset in the frame.
  20. Cray T3 code is very very different...
  21. "$6" / "$f6" etc is the usual syntax for registers, but on Unicos instead "r6"
  22. / "f6" is required.  We use the "r6" / "f6" forms, and have m4 defines expand
  23. them to "$6" or "$f6" where necessary.
  24. "0x" introduces a hex constant in gas and DEC as, but on Unicos "^X" is
  25. required.  The X() macro accommodates this difference.
  26. "cvttqc" is required by DEC as, "cvttq/c" is required by Unicos, and gas will
  27. accept either.  We use cvttqc and have an m4 define expand to cvttq/c where
  28. necessary.
  29. "not" as an alias for "ornot r31, ..." is available in gas and DEC as, but not
  30. the Unicos assembler.  The full "ornot" must be used.
  31. "unop" is not available in Unicos.  We make an m4 define to the usual "ldq_u
  32. r31,0(r30)", and in fact use that define on all systems since it comes out the
  33. same.
  34. "!literal!123" etc explicit relocations as per Tru64 4.0 are apparently not
  35. available in older alpha assemblers (including gas prior to 2.12), according to
  36. the GCC manual, so the assembler macro forms must be used (eg. ldgp).
  37. RELEVANT OPTIMIZATION ISSUES
  38. EV4
  39. 1. This chip has very limited store bandwidth.  The on-chip L1 cache is write-
  40.    through, and a cache line is transferred from the store buffer to the off-
  41.    chip L2 in as much 15 cycles on most systems.  This delay hurts mpn_add_n,
  42.    mpn_sub_n, mpn_lshift, and mpn_rshift.
  43. 2. Pairing is possible between memory instructions and integer arithmetic
  44.    instructions.
  45. 3. mulq and umulh are documented to have a latency of 23 cycles, but 2 of these
  46.    cycles are pipelined.  Thus, multiply instructions can be issued at a rate
  47.    of one each 21st cycle.
  48. EV5
  49. 1. The memory bandwidth of this chip is good, both for loads and stores.  The
  50.    L1 cache can handle two loads or one store per cycle, but two cycles after a
  51.    store, no ld can issue.
  52. 2. mulq has a latency of 12 cycles and an issue rate of 1 each 8th cycle.
  53.    umulh has a latency of 14 cycles and an issue rate of 1 each 10th cycle.
  54.    (Note that published documentation gets these numbers slightly wrong.)
  55. 3. mpn_add_n.  With 4-fold unrolling, we need 37 instructions, whereof 12
  56.    are memory operations.  This will take at least
  57. ceil(37/2) [dual issue] + 1 [taken branch] = 19 cycles
  58.    We have 12 memory cycles, plus 4 after-store conflict cycles, or 16 data
  59.    cache cycles, which should be completely hidden in the 19 issue cycles.
  60.    The computation is inherently serial, with these dependencies:
  61.        ldq  ldq
  62.    /
  63.   (or)   addq |
  64.    |   /    |
  65.    | addq  cmpult
  66.       |     |
  67.      cmpult  |
  68.    /
  69.   or
  70.    I.e., 3 operations are needed between carry-in and carry-out, making 12
  71.    cycles the absolute minimum for the 4 limbs.  We could replace the `or' with
  72.    a cmoveq/cmovne, which could issue one cycle earlier that the `or', but that
  73.    might waste a cycle on EV4.  The total depth remain unaffected, since cmov
  74.    has a latency of 2 cycles.
  75.      addq
  76.      /   
  77.    addq  cmpult
  78.      |      
  79.    cmpult -> cmovne
  80.   Montgomery has a slightly different way of computing carry that requires one
  81.   less instruction, but has depth 4 (instead of the current 3).  Since the code
  82.   is currently instruction issue bound, Montgomery's idea should save us 1/2
  83.   cycle per limb, or bring us down to a total of 17 cycles or 4.25 cycles/limb.
  84.   Unfortunately, this method will not be good for the EV6.
  85. 4. addmul_1 and friends: We previously had a scheme for splitting the single-
  86.    limb operand in 21-bits chunks and the multi-limb operand in 32-bit chunks,
  87.    and then use FP operations for every 2nd multiply, and integer operations
  88.    for every 2nd multiply.
  89.    But it seems much better to split the single-limb operand in 16-bit chunks,
  90.    since we save many integer shifts and adds that way.  See powerpc64/README
  91.    for some more details.
  92. EV6
  93. Here we have a really parallel pipeline, capable of issuing up to 4 integer
  94. instructions per cycle.  In actual practice, it is never possible to sustain
  95. more than 3.5 integer insns/cycle due to rename register shortage.  One integer
  96. multiply instruction can issue each cycle.  To get optimal speed, we need to
  97. pretend we are vectorizing the code, i.e., minimize the depth of recurrences.
  98. There are two dependencies to watch out for.  1) Address arithmetic
  99. dependencies, and 2) carry propagation dependencies.
  100. We can avoid serializing due to address arithmetic by unrolling loops, so that
  101. addresses don't depend heavily on an index variable.  Avoiding serializing
  102. because of carry propagation is trickier; the ultimate performance of the code
  103. will be determined of the number of latency cycles it takes from accepting
  104. carry-in to a vector point until we can generate carry-out.
  105. Most integer instructions can execute in either the L0, U0, L1, or U1
  106. pipelines.  Shifts only execute in U0 and U1, and multiply only in U1.
  107. CMOV instructions split into two internal instructions, CMOV1 and CMOV2.  CMOV
  108. split the mapping process (see pg 2-26 in cmpwrgd.pdf), suggesting the CMOV
  109. should always be placed as the last instruction of an aligned 4 instruction
  110. block, or perhaps simply avoided.
  111. Perhaps the most important issue is the latency between the L0/U0 and L1/U1
  112. clusters; a result obtained on either cluster has an extra cycle of latency for
  113. consumers in the opposite cluster.  Because of the dynamic nature of the
  114. implementation, it is hard to predict where an instruction will execute.
  115. REFERENCES
  116. "Alpha Architecture Handbook", version 4, Compaq, October 1998, order number
  117. EC-QD2KC-TE.
  118. "Alpha 21164 Microprocessor Hardware Reference Manual", Compaq, December 1998,
  119. order number EC-QP99C-TE.
  120. "Alpha 21264/EV67 Microprocessor Hardware Reference Manual", revision 1.4,
  121. Compaq, September 2000, order number DS-0028B-TE.
  122. "Compiler Writer's Guide for the Alpha 21264", Compaq, June 1999, order number
  123. EC-RJ66A-TE.
  124. All of the above are available online from
  125.   http://ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
  126.   ftp://ftp.compaq.com/pub/products/alphaCPUdocs
  127. "Tru64 Unix Assembly Language Programmer's Guide", Compaq, March 1996, part
  128. number AA-PS31D-TE.
  129. "Digital UNIX Calling Standard for Alpha Systems", Digital Equipment Corp,
  130. March 1996, part number AA-PY8AC-TE.
  131. The above are available online,
  132.   http://h30097.www3.hp.com/docs/pub_page/V40F_DOCS.HTM
  133. (Dunno what h30097 means in this URL, but if it moves try searching for "tru64
  134. online documentation" from the main www.hp.com page.)
  135. ----------------
  136. Local variables:
  137. mode: text
  138. fill-column: 79
  139. End: