ClGenerators.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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. virtual mnd::MandelDevice* getDevice(void);
  36. };
  37. class mnd::ClGeneratorFloat : public ClGenerator
  38. {
  39. bool useVec;
  40. public:
  41. ClGeneratorFloat(MandelDevice& device, const std::string& code = getFloat_cl());
  42. virtual ~ClGeneratorFloat(void) = default;
  43. virtual void generate(const MandelInfo& info, float* data) override;
  44. protected:
  45. virtual std::string getKernelCode(bool smooth) const;
  46. };
  47. class mnd::ClGeneratorDoubleFloat : public ClGenerator
  48. {
  49. public:
  50. ClGeneratorDoubleFloat(MandelDevice& device);
  51. virtual ~ClGeneratorDoubleFloat(void) = default;
  52. virtual void generate(const MandelInfo& info, float* data) override;
  53. protected:
  54. virtual std::string getKernelCode(bool smooth) const;
  55. };
  56. class mnd::ClGeneratorDouble : public ClGenerator
  57. {
  58. public:
  59. ClGeneratorDouble(mnd::MandelDevice& device, const std::string& source = getDouble_cl());
  60. virtual ~ClGeneratorDouble(void) = default;
  61. virtual void generate(const MandelInfo& info, float* data) override;
  62. protected:
  63. virtual std::string getKernelCode(bool smooth) const;
  64. };
  65. class mnd::ClGeneratorDoubleDouble : public ClGenerator
  66. {
  67. bool smooth;
  68. public:
  69. ClGeneratorDoubleDouble(mnd::MandelDevice& device);
  70. virtual ~ClGeneratorDoubleDouble(void) = default;
  71. virtual void generate(const MandelInfo& info, float* data) override;
  72. protected:
  73. virtual std::string getKernelCode(bool smooth) const;
  74. };
  75. class mnd::ClGeneratorQuadDouble : public ClGenerator
  76. {
  77. bool smooth;
  78. public:
  79. ClGeneratorQuadDouble(mnd::MandelDevice& device);
  80. virtual ~ClGeneratorQuadDouble(void) = default;
  81. virtual void generate(const MandelInfo& info, float* data) override;
  82. protected:
  83. virtual std::string getKernelCode(bool smooth) const;
  84. };
  85. class mnd::ClGenerator128 : public ClGenerator
  86. {
  87. public:
  88. ClGenerator128(mnd::MandelDevice& device);
  89. virtual ~ClGenerator128(void) = default;
  90. virtual void generate(const MandelInfo& info, float* data) override;
  91. protected:
  92. virtual std::string getKernelCode(bool smooth) const;
  93. };
  94. class mnd::ClGenerator64 : public ClGenerator
  95. {
  96. public:
  97. ClGenerator64(mnd::MandelDevice& device);
  98. virtual ~ClGenerator64(void) = default;
  99. virtual void generate(const MandelInfo& info, float* data) override;
  100. protected:
  101. virtual std::string getKernelCode(bool smooth) const;
  102. };
  103. #endif // WITH_OPENCL
  104. #endif // MANDEL_CLGENERATORS_H