gen_fftw_ref.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from __future__ import division, print_function, absolute_import
  2. from subprocess import Popen, PIPE, STDOUT
  3. import numpy as np
  4. SZ = [2, 3, 4, 8, 12, 15, 16, 17, 32, 64, 128, 256, 512, 1024]
  5. def gen_data(dt):
  6. arrays = {}
  7. if dt == np.double:
  8. pg = './fftw_double'
  9. elif dt == np.float32:
  10. pg = './fftw_single'
  11. else:
  12. raise ValueError("unknown: %s" % dt)
  13. # Generate test data using FFTW for reference
  14. for type in [1, 2, 3, 4, 5, 6, 7, 8]:
  15. arrays[type] = {}
  16. for sz in SZ:
  17. a = Popen([pg, str(type), str(sz)], stdout=PIPE, stderr=STDOUT)
  18. st = [i.strip() for i in a.stdout.readlines()]
  19. arrays[type][sz] = np.fromstring(",".join(st), sep=',', dtype=dt)
  20. return arrays
  21. # generate single precision data
  22. data = gen_data(np.float32)
  23. filename = 'fftw_single_ref'
  24. # Save ref data into npz format
  25. d = {'sizes': SZ}
  26. for type in [1, 2, 3, 4]:
  27. for sz in SZ:
  28. d['dct_%d_%d' % (type, sz)] = data[type][sz]
  29. d['sizes'] = SZ
  30. for type in [5, 6, 7, 8]:
  31. for sz in SZ:
  32. d['dst_%d_%d' % (type-4, sz)] = data[type][sz]
  33. np.savez(filename, **d)
  34. # generate double precision data
  35. data = gen_data(np.float64)
  36. filename = 'fftw_double_ref'
  37. # Save ref data into npz format
  38. d = {'sizes': SZ}
  39. for type in [1, 2, 3, 4]:
  40. for sz in SZ:
  41. d['dct_%d_%d' % (type, sz)] = data[type][sz]
  42. d['sizes'] = SZ
  43. for type in [5, 6, 7, 8]:
  44. for sz in SZ:
  45. d['dst_%d_%d' % (type-4, sz)] = data[type][sz]
  46. np.savez(filename, **d)