Guest User

Untitled

a guest
Dec 12th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.54 KB | None | 0 0
  1. (cl:defpackage #:avx2
  2. (:use :cl)
  3. (:export #:d4+ #:d4* #:d4ref #:d4set))
  4.  
  5. (cl:in-package #:avx2)
  6.  
  7. (sb-c:defknown (d4+ d4*) ((sb-ext:simd-pack-256 double-float)
  8. (sb-ext:simd-pack-256 double-float))
  9. (sb-ext:simd-pack-256 double-float)
  10. (sb-c:movable sb-c:flushable sb-c:always-translatable)
  11. :overwrite-fndb-silently t)
  12.  
  13. (sb-c:defknown d4ref ((simple-array double-float (*)) sb-int:index)
  14. (sb-ext:simd-pack-256 double-float)
  15. (sb-c:movable sb-c:flushable sb-c:always-translatable)
  16. :overwrite-fndb-silently t)
  17.  
  18. (sb-c:defknown d4set ((simple-array double-float (*))
  19. sb-int:index
  20. (sb-ext:simd-pack-256 double-float))
  21. (sb-ext:simd-pack-256 double-float)
  22. (sb-c:movable sb-c:unsafely-flushable sb-c:always-translatable)
  23. :overwrite-fndb-silently t)
  24.  
  25. (cl:in-package #:sb-vm)
  26.  
  27. (define-vop (avx2:d4+)
  28. (:translate avx2:d4+)
  29. (:policy :fast-safe)
  30. (:args (x :scs (double-avx2-reg))
  31. (y :scs (double-avx2-reg)))
  32. (:arg-types simd-pack-256-double simd-pack-256-double)
  33. (:results (r :scs (double-avx2-reg)))
  34. (:result-types simd-pack-256-double)
  35. (:generator 4 (inst vaddpd r x y)))
  36.  
  37. (define-vop (avx2:d4*)
  38. (:translate avx2:d4*)
  39. (:policy :fast-safe)
  40. (:args (x :scs (double-avx2-reg))
  41. (y :scs (double-avx2-reg)))
  42. (:arg-types simd-pack-256-double simd-pack-256-double)
  43. (:results (r :scs (double-avx2-reg)))
  44. (:result-types simd-pack-256-double)
  45. (:generator 4 (inst vmulpd r x y)))
  46.  
  47. (define-vop (avx2:d4ref)
  48. (:translate avx2:d4ref)
  49. (:policy :fast-safe)
  50. (:args (array :scs (descriptor-reg))
  51. (index :scs (any-reg)))
  52. (:arg-types simple-array-double-float positive-fixnum)
  53. (:results (value :scs (double-avx2-reg)))
  54. (:result-types simd-pack-256-double)
  55. (:generator 5 (inst vmovupd value
  56. (make-ea-for-float-ref
  57. array index 0 32
  58. :scale (ash 1 (- word-shift n-fixnum-tag-bits))))))
  59.  
  60. (define-vop (avx2:d4set)
  61. (:translate avx2:d4set)
  62. (:policy :fast-safe)
  63. (:args (array :scs (descriptor-reg))
  64. (index :scs (any-reg))
  65. (value :scs (double-avx2-reg) :target result))
  66. (:arg-types simple-array-double-float positive-fixnum simd-pack-256-double)
  67. (:results (result :scs (double-avx2-reg)))
  68. (:result-types simd-pack-256-double)
  69. (:generator 5 (inst vmovupd
  70. (make-ea-for-float-ref
  71. array index 0 32
  72. :scale (ash 1 (- word-shift n-fixnum-tag-bits)))
  73. value)
  74. (move result value)))
  75.  
  76. (cl:in-package #:avx2)
  77.  
  78. (defun d4+ (x y)
  79. (d4+ x y))
  80.  
  81. (defun d4* (x y)
  82. (d4* x y))
  83.  
  84. (defun d4ref (array index)
  85. (d4ref array index))
  86.  
  87. (defun d4set (array index value)
  88. (d4set array index value))
  89.  
  90. (defun jacobi-1d (src dst &optional (iterations 1))
  91. (declare (optimize (speed 3) (safety 0))
  92. (type (simple-array double-float (*)) src dst)
  93. (type (integer 0 #.most-positive-fixnum) iterations))
  94. (loop repeat iterations do
  95. (loop for index from 1 by 4 below (- (length src) 4) do
  96. (d4set dst index
  97. (d4* (d4+ (d4ref src (1- index))
  98. (d4ref src (1+ index)))
  99. (sb-ext:%make-simd-pack-256-double 0.5d0 0.5d0 0.5d0 0.5d0))))
  100. (rotatef src dst))
  101. src)
  102.  
  103. (defun jacobi-test (size iterations)
  104. (let ((a (make-array size :element-type 'double-float :initial-element 0.0d0))
  105. (b (make-array size :element-type 'double-float :initial-element 0.0d0)))
  106. (setf (aref a 0) 1.0d0)
  107. (setf (aref b 0) 1.0d0)
  108. (jacobi-1d a b iterations)))
Add Comment
Please, Sign In to add comment