CpuGenerators.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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. #else //if defined(__arm__) || defined(__aarch64__) || defined(_M_ARM)
  81. template<bool parallel>
  82. class mnd::CpuGenerator<float, mnd::ARM_NEON, parallel> : public MandelGenerator
  83. {
  84. public:
  85. inline CpuGenerator(void) :
  86. MandelGenerator{ mnd::Precision::FLOAT, mnd::ARM_NEON }
  87. {
  88. }
  89. virtual void generate(const MandelInfo& info, float* data);
  90. };
  91. template<bool parallel>
  92. class mnd::CpuGenerator<double, mnd::ARM_NEON, parallel> : public MandelGenerator
  93. {
  94. public:
  95. inline CpuGenerator(void) :
  96. MandelGenerator{ mnd::Precision::DOUBLE, mnd::ARM_NEON }
  97. {
  98. }
  99. virtual void generate(const MandelInfo& info, float* data);
  100. };
  101. template<bool parallel>
  102. class mnd::CpuGenerator<mnd::DoubleDouble, mnd::ARM_NEON, parallel> : public MandelGenerator
  103. {
  104. public:
  105. inline CpuGenerator(void) :
  106. MandelGenerator{ mnd::Precision::DOUBLE_DOUBLE, mnd::ARM_NEON }
  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 MandelGenerator
  114. {
  115. public:
  116. inline CpuGenerator(void) :
  117. MandelGenerator{ mnd::Precision::FLOAT, mnd::X86_AVX_FMA }
  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 MandelGenerator
  124. {
  125. public:
  126. inline CpuGenerator(void) :
  127. MandelGenerator{ mnd::Precision::DOUBLE, mnd::X86_AVX_FMA }
  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 MandelGenerator
  134. {
  135. public:
  136. inline CpuGenerator(void) :
  137. MandelGenerator{ mnd::Precision::DOUBLE_DOUBLE, mnd::X86_AVX_FMA }
  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 MandelGenerator
  144. {
  145. public:
  146. inline CpuGenerator(void) :
  147. MandelGenerator{ mnd::Precision::FLOAT, mnd::X86_AVX_512 }
  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 MandelGenerator
  154. {
  155. public:
  156. inline CpuGenerator(void) :
  157. MandelGenerator{ mnd::Precision::DOUBLE, mnd::X86_AVX_512 }
  158. {
  159. }
  160. virtual void generate(const MandelInfo& info, float* data);
  161. };
  162. #endif // MANDEL_CPUGENERATORS_H