CpuGenerators.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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. ARM_NEON,
  12. };
  13. template<typename T, mnd::CpuExtension ex = mnd::NONE, bool parallel = true, bool smooth = true>
  14. class CpuGenerator;
  15. /*
  16. class CpuGeneratorFloat;
  17. class CpuGeneratorDouble;
  18. class CpuGenerator128;
  19. #if defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86)
  20. class CpuGeneratorSse2Float;
  21. class CpuGeneratorSse2Double;
  22. class CpuGeneratorAvxFloat;
  23. class CpuGeneratorAvxDouble;
  24. class CpuGeneratorAvx512Float;
  25. class CpuGeneratorAvx512Double;
  26. #elif defined(__arm__) || defined(__aarch64__) || defined(_M_ARM)
  27. class CpuGeneratorNeonFloat;
  28. class CpuGeneratorNeonDouble;
  29. #endif
  30. */
  31. }
  32. template<typename T, mnd::CpuExtension ex, bool parallel, bool smooth>
  33. class mnd::CpuGenerator : public Generator
  34. {
  35. public:
  36. virtual void generate(const MandelInfo& info, float* data);
  37. };
  38. template<typename T, bool parallel, bool smooth>
  39. class mnd::CpuGenerator<T, mnd::NONE, parallel, smooth> : public Generator
  40. {
  41. public:
  42. virtual void generate(const MandelInfo& info, float* data);
  43. };
  44. #if defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86)
  45. template<bool parallel, bool smooth>
  46. class mnd::CpuGenerator<float, mnd::X86_SSE2, parallel, smooth> : public Generator
  47. {
  48. public:
  49. virtual void generate(const MandelInfo& info, float* data);
  50. };
  51. template<bool parallel, bool smooth>
  52. class mnd::CpuGenerator<double, mnd::X86_SSE2, parallel, smooth> : public Generator
  53. {
  54. public:
  55. virtual void generate(const MandelInfo& info, float* data);
  56. };
  57. template<bool parallel, bool smooth>
  58. class mnd::CpuGenerator<float, mnd::X86_AVX, parallel, smooth> : public Generator
  59. {
  60. public:
  61. virtual void generate(const MandelInfo& info, float* data);
  62. };
  63. template<bool parallel, bool smooth>
  64. class mnd::CpuGenerator<double, mnd::X86_AVX, parallel, smooth> : public Generator
  65. {
  66. public:
  67. virtual void generate(const MandelInfo& info, float* data);
  68. };
  69. #elif defined(__arm__) || defined(__aarch64__) || defined(_M_ARM)
  70. template<typename T, bool parallel, bool smooth>
  71. class mnd::CpuGenerator<T, mnd::ARM_NEON, parallel, smooth> : public Generator
  72. {
  73. public:
  74. virtual void generate(const MandelInfo& info, float* data);
  75. };
  76. #endif
  77. template<bool parallel, bool smooth>
  78. class mnd::CpuGenerator<Fixed128, mnd::NONE, parallel, smooth> : public Generator
  79. {
  80. public:
  81. virtual void generate(const MandelInfo& info, float* data);
  82. };
  83. /*
  84. class mnd::CpuGeneratorFloat : public Generator
  85. {
  86. public:
  87. virtual void generate(const MandelInfo& info, float* data);
  88. };
  89. class mnd::CpuGeneratorDouble : public Generator
  90. {
  91. public:
  92. virtual void generate(const MandelInfo& info, float* data);
  93. };
  94. class mnd::CpuGenerator128 : public Generator
  95. {
  96. public:
  97. virtual void generate(const MandelInfo& info, float* data);
  98. };
  99. #if defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86)
  100. class mnd::CpuGeneratorSse2Float : public Generator
  101. {
  102. public:
  103. virtual void generate(const MandelInfo& info, float* data);
  104. };
  105. class mnd::CpuGeneratorSse2Double : public Generator
  106. {
  107. public:
  108. virtual void generate(const MandelInfo& info, float* data);
  109. };
  110. class mnd::CpuGeneratorAvxFloat : public Generator
  111. {
  112. public:
  113. virtual void generate(const MandelInfo& info, float* data);
  114. };
  115. class mnd::CpuGeneratorAvxDouble : public Generator
  116. {
  117. public:
  118. virtual void generate(const MandelInfo& info, float* data);
  119. };
  120. class mnd::CpuGeneratorAvx512Float : public Generator
  121. {
  122. public:
  123. virtual void generate(const MandelInfo& info, float* data);
  124. };
  125. class mnd::CpuGeneratorAvx512Double : public Generator
  126. {
  127. public:
  128. virtual void generate(const MandelInfo& info, float* data);
  129. };
  130. #elif defined(__arm__) || defined(__aarch64__) || defined(_M_ARM)
  131. class mnd::CpuGeneratorNeonFloat : public Generator
  132. {
  133. public:
  134. virtual void generate(const MandelInfo& info, float* data);
  135. };
  136. class mnd::CpuGeneratorNeonDouble : public Generator
  137. {
  138. public:
  139. virtual void generate(const MandelInfo& info, float* data);
  140. };
  141. #endif
  142. */
  143. #endif // MANDEL_CPUGENERATORS_H