ClGenerators.h 3.0 KB

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