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

数学计算

开发平台:

Unix_Linux

  1. Copyright 1996, 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
  2. This file is part of the GNU MP Library.
  3. The GNU MP Library is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU Lesser General Public License as published by
  5. the Free Software Foundation; either version 3 of the License, or (at your
  6. option) any later version.
  7. The GNU MP Library is distributed in the hope that it will be useful, but
  8. WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  9. or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  10. License for more details.
  11. You should have received a copy of the GNU Lesser General Public License
  12. along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  13.                    INTEL PENTIUM P5 MPN SUBROUTINES
  14. This directory contains mpn functions optimized for Intel Pentium (P5,P54)
  15. processors.  The mmx subdirectory has additional code for Pentium with MMX
  16. (P55).
  17. STATUS
  18.                                 cycles/limb
  19. mpn_add_n/sub_n            2.375
  20. mpn_mul_1                 12.0
  21. mpn_add/submul_1          14.0
  22. mpn_mul_basecase          14.2 cycles/crossproduct (approx)
  23. mpn_sqr_basecase           8 cycles/crossproduct (approx)
  24.                                    or 15.5 cycles/triangleproduct (approx)
  25. mpn_l/rshift               5.375 normal (6.0 on P54)
  26.    1.875 special shift by 1 bit
  27. mpn_divrem_1              44.0
  28. mpn_mod_1                 28.0
  29. mpn_divexact_by3          15.0
  30. mpn_copyi/copyd            1.0
  31. Pentium MMX gets the following improvements
  32. mpn_l/rshift               1.75
  33. mpn_mul_1                 12.0 normal, 7.0 for 16-bit multiplier
  34. mpn_add_n and mpn_sub_n run at asymptotically 2 cycles/limb.  Due to loop
  35. overhead and other delays (cache refill?), they run at or near 2.5
  36. cycles/limb.
  37. mpn_mul_1, mpn_addmul_1, mpn_submul_1 all run 1 cycle faster than they
  38. should.  Intel documentation says a mul instruction is 10 cycles, but it
  39. measures 9 and the routines using it run as 9.
  40. P55 MMX AND X87
  41. The cost of switching between MMX and x87 floating point on P55 is about 100
  42. cycles (fld1/por/emms for instance).  In order to avoid that the two aren't
  43. mixed and currently that means using MMX and not x87.
  44. MMX offers a big speedup for lshift and rshift, and a nice speedup for
  45. 16-bit multipliers in mpn_mul_1.  If fast code using x87 is found then
  46. perhaps the preference for MMX will be reversed.
  47. P54 SHLDL
  48. mpn_lshift and mpn_rshift run at about 6 cycles/limb on P5 and P54, but the
  49. documentation indicates that they should take only 43/8 = 5.375 cycles/limb,
  50. or 5 cycles/limb asymptotically.  The P55 runs them at the expected speed.
  51. It seems that on P54 a shldl or shrdl allows pairing in one following cycle,
  52. but not two.  For example, back to back repetitions of the following
  53. shldl( %cl, %eax, %ebx)
  54. xorl %edx, %edx
  55. xorl %esi, %esi
  56. run at 5 cycles, as expected, but repetitions of the following run at 7
  57. cycles, whereas 6 would be expected (and is achieved on P55),
  58. shldl( %cl, %eax, %ebx)
  59. xorl %edx, %edx
  60. xorl %esi, %esi
  61. xorl %edi, %edi
  62. xorl %ebp, %ebp
  63. Three xorls run at 7 cycles too, so it doesn't seem to be just that pairing
  64. inhibited is only in the second following cycle (or something like that).
  65. Avoiding this problem would bring P54 shifts down from 6.0 c/l to 5.5 with a
  66. pattern of shift, 2 loads, shift, 2 stores, shift, etc.  A start has been
  67. made on something like that, but it's not yet complete.
  68. OTHER NOTES
  69. Prefetching Destinations
  70.     Pentium doesn't allocate cache lines on writes, unlike most other modern
  71.     processors.  Since the functions in the mpn class do array writes, we
  72.     have to handle allocating the destination cache lines by reading a word
  73.     from it in the loops, to achieve the best performance.
  74. Prefetching Sources
  75.     Prefetching of sources is pointless since there's no out-of-order loads.
  76.     Any load instruction blocks until the line is brought to L1, so it may
  77.     as well be the load that wants the data which blocks.
  78. Data Cache Bank Clashes
  79.     Pairing of memory operations requires that the two issued operations
  80.     refer to different cache banks (ie. different addresses modulo 32
  81.     bytes).  The simplest way to ensure this is to read/write two words from
  82.     the same object.  If we make operations on different objects, they might
  83.     or might not be to the same cache bank.
  84. PIC %eip Fetching
  85.     A simple call $+5 and popl can be used to get %eip, there's no need to
  86.     balance calls and returns since P5 doesn't have any return stack branch
  87.     prediction.
  88. Float Multiplies
  89.     fmul is pairable and can be issued every 2 cycles (with a 4 cycle
  90.     latency for data ready to use).  This is a lot better than integer mull
  91.     or imull at 9 cycles non-pairing.  Unfortunately the advantage is
  92.     quickly eaten away by needing to throw data through memory back to the
  93.     integer registers to adjust for fild and fist being signed, and to do
  94.     things like propagating carry bits.
  95. REFERENCES
  96. "Intel Architecture Optimization Manual", 1997, order number 242816.  This
  97. is mostly about P5, the parts about P6 aren't relevant.  Available on-line:
  98.         http://download.intel.com/design/PentiumII/manuals/242816.htm
  99. ----------------
  100. Local variables:
  101. mode: text
  102. fill-column: 76
  103. End: