CpuGenerators.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #ifndef MANDEL_CPUGENERATORS_H
  2. #define MANDEL_CPUGENERATORS_H
  3. #include "Generators.h"
  4. namespace mnd
  5. {
  6. enum CpuExtension
  7. {
  8. NONE,
  9. X86_SSE2,
  10. X86_AVX,
  11. X86_AVX_FMA,
  12. X86_AVX_512,
  13. ARM_NEON,
  14. };
  15. template<typename T, mnd::CpuExtension ex = mnd::NONE, bool parallel = true>
  16. class CpuGenerator;
  17. }
  18. template<typename T, mnd::CpuExtension ex, bool parallel>
  19. class mnd::CpuGenerator : public Generator
  20. {
  21. public:
  22. inline CpuGenerator(void) :
  23. Generator{ mnd::getPrecision<T>() }
  24. {
  25. }
  26. virtual void generate(const MandelInfo& info, float* data);
  27. };
  28. template<typename T, bool parallel>
  29. class mnd::CpuGenerator<T, mnd::NONE, parallel> : public Generator
  30. {
  31. public:
  32. inline CpuGenerator(void) :
  33. Generator{ mnd::getPrecision<T>() }
  34. {
  35. }
  36. virtual void generate(const MandelInfo& info, float* data);
  37. };
  38. #if defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86)
  39. template<bool parallel>
  40. class mnd::CpuGenerator<float, mnd::X86_SSE2, parallel> : public Generator
  41. {
  42. public:
  43. inline CpuGenerator(void) :
  44. Generator{ mnd::getPrecision<float>() }
  45. {
  46. }
  47. virtual void generate(const MandelInfo& info, float* data);
  48. };
  49. template<bool parallel>
  50. class mnd::CpuGenerator<double, mnd::X86_SSE2, parallel> : public Generator
  51. {
  52. public:
  53. inline CpuGenerator(void) :
  54. Generator{ mnd::getPrecision<double>() }
  55. {
  56. }
  57. virtual void generate(const MandelInfo& info, float* data);
  58. };
  59. template<bool parallel>
  60. class mnd::CpuGenerator<float, mnd::X86_AVX, parallel> : public Generator
  61. {
  62. public:
  63. inline CpuGenerator(void) :
  64. Generator{ mnd::getPrecision<float>() }
  65. {
  66. }
  67. virtual void generate(const MandelInfo& info, float* data);
  68. };
  69. template<bool parallel>
  70. class mnd::CpuGenerator<double, mnd::X86_AVX, parallel> : public Generator
  71. {
  72. public:
  73. inline CpuGenerator(void) :
  74. Generator{ mnd::getPrecision<double>() }
  75. {
  76. }
  77. virtual void generate(const MandelInfo& info, float* data);
  78. };
  79. template<bool parallel>
  80. class mnd::CpuGenerator<mnd::DoubleDouble, mnd::X86_AVX, parallel> : public Generator
  81. {
  82. public:
  83. inline CpuGenerator(void) :
  84. Generator{ mnd::getPrecision<DoubleDouble>() }
  85. {
  86. }
  87. virtual void generate(const MandelInfo& info, float* data);
  88. };
  89. #else //if defined(__arm__) || defined(__aarch64__) || defined(_M_ARM)
  90. template<bool parallel>
  91. class mnd::CpuGenerator<float, mnd::ARM_NEON, parallel> : public Generator
  92. {
  93. public:
  94. CpuGenerator(void);
  95. inline CpuGenerator(void) :
  96. Generator{ mnd::getPrecision<float>() }
  97. {
  98. }
  99. virtual void generate(const MandelInfo& info, float* data);
  100. };
  101. template<bool parallel>
  102. class mnd::CpuGenerator<double, mnd::ARM_NEON, parallel> : public Generator
  103. {
  104. public:
  105. inline CpuGenerator(void) :
  106. Generator{ mnd::getPrecision<double>() }
  107. {
  108. }
  109. virtual void generate(const MandelInfo& info, float* data);
  110. };
  111. #endif
  112. template<bool parallel>
  113. class mnd::CpuGenerator<float, mnd::X86_AVX_FMA, parallel> : public Generator
  114. {
  115. public:
  116. inline CpuGenerator(void) :
  117. Generator{ mnd::getPrecision<float>() }
  118. {
  119. }
  120. virtual void generate(const MandelInfo& info, float* data);
  121. };
  122. template<bool parallel>
  123. class mnd::CpuGenerator<double, mnd::X86_AVX_FMA, parallel> : public Generator
  124. {
  125. public:
  126. inline CpuGenerator(void) :
  127. Generator{ mnd::getPrecision<double>() }
  128. {
  129. }
  130. virtual void generate(const MandelInfo& info, float* data);
  131. };
  132. template<bool parallel>
  133. class mnd::CpuGenerator<mnd::DoubleDouble, mnd::X86_AVX_FMA, parallel> : public Generator
  134. {
  135. public:
  136. inline CpuGenerator(void) :
  137. Generator{ mnd::getPrecision<DoubleDouble>() }
  138. {
  139. }
  140. virtual void generate(const MandelInfo& info, float* data);
  141. };
  142. template<bool parallel>
  143. class mnd::CpuGenerator<float, mnd::X86_AVX_512, parallel> : public Generator
  144. {
  145. public:
  146. inline CpuGenerator(void) :
  147. Generator{ mnd::getPrecision<float>() }
  148. {
  149. }
  150. virtual void generate(const MandelInfo& info, float* data);
  151. };
  152. template<bool parallel>
  153. class mnd::CpuGenerator<double, mnd::X86_AVX_512, parallel> : public Generator
  154. {
  155. public:
  156. inline CpuGenerator(void) :
  157. Generator{ mnd::getPrecision<double>() }
  158. {
  159. }
  160. virtual void generate(const MandelInfo& info, float* data);
  161. };
  162. #endif // MANDEL_CPUGENERATORS_H