ClGenerators.h 3.1 KB

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