ClGenerators.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #ifndef MANDEL_CLGENERATORS_H
  2. #define MANDEL_CLGENERATORS_H
  3. #ifdef WITH_OPENCL
  4. #include "Generators.h"
  5. #ifdef __APPLE__
  6. #include <OpenCL/cl.hpp>
  7. #else
  8. #include <CL/cl.hpp>
  9. #endif
  10. namespace mnd
  11. {
  12. class ClGenerator;
  13. class ClGeneratorFloat;
  14. class ClGeneratorDoubleFloat;
  15. class ClGeneratorDouble;
  16. class ClGeneratorDoubleDouble;
  17. class ClGeneratorQuadDouble;
  18. class ClGenerator128;
  19. class ClGenerator64;
  20. }
  21. class mnd::ClGenerator : public MandelGenerator
  22. {
  23. protected:
  24. cl::Device device;
  25. cl::Context context;
  26. cl::Program program;
  27. cl::CommandQueue queue;
  28. cl::Kernel kernel;
  29. public:
  30. ClGenerator(cl::Device device, const std::string& source, const mnd::Real& precision);
  31. virtual ~ClGenerator(void);
  32. virtual void generate(const MandelInfo& info, float* data) = 0;
  33. };
  34. class mnd::ClGeneratorFloat : public ClGenerator
  35. {
  36. bool useVec;
  37. public:
  38. ClGeneratorFloat(cl::Device device, const std::string& code);
  39. virtual ~ClGeneratorFloat(void) = default;
  40. virtual void generate(const MandelInfo& info, float* data) override;
  41. protected:
  42. virtual std::string getKernelCode(bool smooth) const;
  43. };
  44. class mnd::ClGeneratorDoubleFloat : public ClGenerator
  45. {
  46. public:
  47. ClGeneratorDoubleFloat(cl::Device device);
  48. virtual ~ClGeneratorDoubleFloat(void) = default;
  49. virtual void generate(const MandelInfo& info, float* data) override;
  50. protected:
  51. virtual std::string getKernelCode(bool smooth) const;
  52. };
  53. class mnd::ClGeneratorDouble : public ClGenerator
  54. {
  55. public:
  56. ClGeneratorDouble(cl::Device device);
  57. virtual ~ClGeneratorDouble(void) = default;
  58. virtual void generate(const MandelInfo& info, float* data) override;
  59. protected:
  60. virtual std::string getKernelCode(bool smooth) const;
  61. };
  62. class mnd::ClGeneratorDoubleDouble : public ClGenerator
  63. {
  64. bool smooth;
  65. public:
  66. ClGeneratorDoubleDouble(cl::Device device);
  67. virtual ~ClGeneratorDoubleDouble(void) = default;
  68. virtual void generate(const MandelInfo& info, float* data) override;
  69. protected:
  70. virtual std::string getKernelCode(bool smooth) const;
  71. };
  72. class mnd::ClGeneratorQuadDouble : public ClGenerator
  73. {
  74. bool smooth;
  75. public:
  76. ClGeneratorQuadDouble(cl::Device device);
  77. virtual ~ClGeneratorQuadDouble(void) = default;
  78. virtual void generate(const MandelInfo& info, float* data) override;
  79. protected:
  80. virtual std::string getKernelCode(bool smooth) const;
  81. };
  82. class mnd::ClGenerator128 : public ClGenerator
  83. {
  84. public:
  85. ClGenerator128(cl::Device device);
  86. virtual ~ClGenerator128(void) = default;
  87. virtual void generate(const MandelInfo& info, float* data) override;
  88. protected:
  89. virtual std::string getKernelCode(bool smooth) const;
  90. };
  91. class mnd::ClGenerator64 : public ClGenerator
  92. {
  93. public:
  94. ClGenerator64(cl::Device device);
  95. virtual ~ClGenerator64(void) = default;
  96. virtual void generate(const MandelInfo& info, float* data) override;
  97. protected:
  98. virtual std::string getKernelCode(bool smooth) const;
  99. };
  100. #endif // WITH_OPENCL
  101. #endif // MANDEL_CLGENERATORS_H