CpuGenerators.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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 = mnd::NONE, bool parallel = true, bool smooth = true>
  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. /*
  78. class mnd::CpuGeneratorFloat : public Generator
  79. {
  80. public:
  81. virtual void generate(const MandelInfo& info, float* data);
  82. };
  83. class mnd::CpuGeneratorDouble : public Generator
  84. {
  85. public:
  86. virtual void generate(const MandelInfo& info, float* data);
  87. };
  88. class mnd::CpuGenerator128 : public Generator
  89. {
  90. public:
  91. virtual void generate(const MandelInfo& info, float* data);
  92. };
  93. #if defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86)
  94. class mnd::CpuGeneratorSse2Float : public Generator
  95. {
  96. public:
  97. virtual void generate(const MandelInfo& info, float* data);
  98. };
  99. class mnd::CpuGeneratorSse2Double : public Generator
  100. {
  101. public:
  102. virtual void generate(const MandelInfo& info, float* data);
  103. };
  104. class mnd::CpuGeneratorAvxFloat : public Generator
  105. {
  106. public:
  107. virtual void generate(const MandelInfo& info, float* data);
  108. };
  109. class mnd::CpuGeneratorAvxDouble : public Generator
  110. {
  111. public:
  112. virtual void generate(const MandelInfo& info, float* data);
  113. };
  114. class mnd::CpuGeneratorAvx512Float : public Generator
  115. {
  116. public:
  117. virtual void generate(const MandelInfo& info, float* data);
  118. };
  119. class mnd::CpuGeneratorAvx512Double : public Generator
  120. {
  121. public:
  122. virtual void generate(const MandelInfo& info, float* data);
  123. };
  124. #elif defined(__arm__) || defined(__aarch64__) || defined(_M_ARM)
  125. class mnd::CpuGeneratorNeonFloat : public Generator
  126. {
  127. public:
  128. virtual void generate(const MandelInfo& info, float* data);
  129. };
  130. class mnd::CpuGeneratorNeonDouble : public Generator
  131. {
  132. public:
  133. virtual void generate(const MandelInfo& info, float* data);
  134. };
  135. #endif
  136. */
  137. #endif // MANDEL_CPUGENERATORS_H