Advertisement
Guest User

Untitled

a guest
Sep 19th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.60 KB | None | 0 0
  1. #![feature(box_syntax)]
  2.  
  3. extern crate simd;
  4. use simd::x86::avx::f32x8;
  5. use simd::x86::avx::AvxF32x8;
  6.  
  7. use std::time::Instant;
  8. const N: usize = 1024;
  9. const M: usize = 1024;
  10.  
  11. /// v = v - u (<u, v> / <u, u>)
  12. fn sub_proj(u: &[f32x8], v: &mut [f32x8]) {
  13. assert_eq!(u.len(), v.len());
  14. let mut dot_uv_uu = f32x8::splat(0.);
  15. for i in 0 .. (u.len() / 2) {
  16. let u0 = u[2*i];
  17. let u1 = u[2*i+1];
  18. let v0 = v[2*i];
  19. let v1 = v[2*i+1];
  20. let uv0 = u0 * v0;
  21. let uv1 = u1 * v1;
  22. let uu0 = u0 * u1;
  23. let uu1 = u1 * u1;
  24. let t0 = uv0.hadd(uu0);
  25. let t1 = uv1.hadd(uu1);
  26. let t = t0.hadd(t1);
  27. dot_uv_uu = dot_uv_uu + t;
  28. }
  29. let t = dot_uv_uu.hadd(dot_uv_uu);
  30. let uv = t.extract(0) + t.extract(4);
  31. let uu = t.extract(1) + t.extract(5);
  32. let norm = f32x8::splat(uv / uu);
  33. for i in 0 .. u.len() {
  34. v[i] = v[i] - norm * u[i];
  35. }
  36. }
  37.  
  38.  
  39. fn gram_schmidt(v: &[f32x8], u: &mut [f32x8], vecs: usize) {
  40. assert_eq!(v.len(), u.len());
  41. let n = v.len() / vecs;
  42. let mut u_ki = Vec::with_capacity(n);
  43. u[..n].copy_from_slice(&v[..n]);
  44. for k in 1 .. vecs {
  45. u_ki.clear();
  46. u_ki.extend_from_slice(&v[k*n..k*n+n]);
  47. for i in 1 .. k {
  48. sub_proj(&u[i*n..i*n+n], &mut u_ki);
  49. }
  50. u[k*n..k*n+n].copy_from_slice(&u_ki);
  51. }
  52. }
  53.  
  54.  
  55. fn main() {
  56. let v = box [f32x8::splat(0.3); N/8 * M];
  57. let mut u = box [f32x8::splat(0.2); N/8 * M];
  58. let t0 = Instant::now();
  59. gram_schmidt(&*v, &mut *u, M);
  60. let dt = t0.elapsed();
  61.  
  62. println!("{}.{:09}", dt.as_secs(), dt.subsec_nanos());
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement