CpuGenerators.h 4.8 KB

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