#ifndef MANDEL_CPUGENERATORS_H #define MANDEL_CPUGENERATORS_H #include "Generators.h" namespace mnd { template class CpuGenerator; } template class mnd::CpuGenerator : public MandelGenerator { public: inline CpuGenerator(void) : MandelGenerator{ mnd::getType(), ex } { } virtual void generate(const MandelInfo& info, float* data); }; template class mnd::CpuGenerator : public MandelGenerator { public: inline CpuGenerator(void) : MandelGenerator{ mnd::getType(), mnd::NONE } { } virtual void generate(const MandelInfo& info, float* data); }; #if defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86) template class mnd::CpuGenerator : public MandelGenerator { public: inline CpuGenerator(void) : MandelGenerator{ mnd::Precision::FLOAT, mnd::X86_SSE2 } { } virtual void generate(const MandelInfo& info, float* data); }; template class mnd::CpuGenerator : public MandelGenerator { public: inline CpuGenerator(void) : MandelGenerator{ mnd::Precision::DOUBLE, mnd::X86_SSE2 } { } virtual void generate(const MandelInfo& info, float* data); }; template class mnd::CpuGenerator : public MandelGenerator { public: inline CpuGenerator(void) : MandelGenerator{ mnd::Precision::FLOAT, mnd::X86_AVX } { } virtual void generate(const MandelInfo& info, float* data); }; template class mnd::CpuGenerator : public MandelGenerator { public: inline CpuGenerator(void) : MandelGenerator{ mnd::Precision::DOUBLE, mnd::X86_AVX } { } virtual void generate(const MandelInfo& info, float* data); }; template class mnd::CpuGenerator : public MandelGenerator { public: inline CpuGenerator(void) : MandelGenerator{ mnd::Precision::DOUBLE_DOUBLE, mnd::X86_AVX } { } virtual void generate(const MandelInfo& info, float* data); }; template class mnd::CpuGenerator : public MandelGenerator { public: inline CpuGenerator(void) : MandelGenerator{ mnd::Precision::FLOAT, mnd::X86_AVX_FMA } { } virtual void generate(const MandelInfo& info, float* data); }; template class mnd::CpuGenerator : public MandelGenerator { public: inline CpuGenerator(void) : MandelGenerator{ mnd::Precision::DOUBLE, mnd::X86_AVX_FMA } { } virtual void generate(const MandelInfo& info, float* data); }; template class mnd::CpuGenerator : public MandelGenerator { public: inline CpuGenerator(void) : MandelGenerator{ mnd::Precision::DOUBLE_DOUBLE, mnd::X86_AVX_FMA } { } virtual void generate(const MandelInfo& info, float* data); }; template class mnd::CpuGenerator : public MandelGenerator { public: inline CpuGenerator(void) : MandelGenerator{ mnd::Precision::QUAD_DOUBLE, mnd::X86_AVX_FMA } { } virtual void generate(const MandelInfo& info, float* data); }; template class mnd::CpuGenerator : public MandelGenerator { public: inline CpuGenerator(void) : MandelGenerator{ mnd::Precision::FLOAT, mnd::X86_AVX_512 } { } virtual void generate(const MandelInfo& info, float* data); }; template class mnd::CpuGenerator : public MandelGenerator { public: inline CpuGenerator(void) : MandelGenerator{ mnd::Precision::DOUBLE, mnd::X86_AVX_512 } { } virtual void generate(const MandelInfo& info, float* data); }; #else //if defined(__arm__) || defined(__aarch64__) || defined(_M_ARM) template class mnd::CpuGenerator : public Generator { public: CpuGenerator(void); inline CpuGenerator(void) : MandelGenerator{ mnd::Precision::FLOAT, mnd::ARM_NEON } { } virtual void generate(const MandelInfo& info, float* data); }; template class mnd::CpuGenerator : public Generator { public: inline CpuGenerator(void) : MandelGenerator{ mnd::Precision::DOUBLE, mnd::ARM_NEON } { } virtual void generate(const MandelInfo& info, float* data); }; #endif #endif // MANDEL_CPUGENERATORS_H