1 #ifndef MHO_OpenCLScalarMultiply_HH__
2 #define MHO_OpenCLScalarMultiply_HH__
29 : fInitialized(false), fFactor(0), fNLocal(0), fNGlobal(0), fKernel(nullptr),
38 void SetFactor(XFactorType factor) { fFactor = factor; };
63 fArrayBuffer = in->template AsExtension< MHO_OpenCLNDArrayBuffer< XArrayType > >();
67 fArrayBuffer = in->template MakeExtension< MHO_OpenCLNDArrayBuffer< XArrayType > >();
70 unsigned int array_size = in->GetSize();
72 fKernel->setArg(0, array_size);
73 fKernel->setArg(1, fFactor);
74 fKernel->setArg(2, *(fArrayBuffer->GetDataBuffer()));
77 fNGlobal = array_size;
78 unsigned int dummy = fNLocal - (array_size % fNLocal);
98 fArrayBuffer->WriteDataBuffer();
103 #ifdef ENFORCE_CL_FINISH
110 fArrayBuffer->ReadDataBuffer();
119 ConditionallyResizeOutput(in->GetDimensionArray(), out);
127 bool cached_value = fWriteOut;
130 fWriteOut = cached_value;
138 std::stringstream clFile;
141 std::string flags = GetOpenCLFlags();
144 fKernel = k_builder.
BuildKernel(clFile.str(), std::string(
"VectorScale"), flags);
147 unsigned int preferredWorkgroupMultiple = fKernel->getWorkGroupInfo< CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE >(
149 if(preferredWorkgroupMultiple < fNLocal)
151 fNLocal = preferredWorkgroupMultiple;
155 std::string GetOpenCLFlags()
158 std::stringstream options;
161 std::string factor_type = MHO_ClassName< XFactorType >();
162 std::string
data_type = MHO_ClassName< typename XArrayType::value_type >();
165 if(factor_type.find(std::string(
"complex")) != std::string::npos &&
166 data_type.find(std::string(
"complex")) != std::string::npos)
168 options <<
" -D COMPLEX_COMPLEX";
172 options <<
" -D CL_FACTOR_TYPE=" << MHO_ClassName< typename MHO_OpenCLTypeMap< XFactorType >::mapped_type >();
173 options <<
" -D CL_DATA_TYPE="
174 << MHO_ClassName< typename MHO_OpenCLTypeMap< typename XArrayType::value_type >::mapped_type >();
176 return options.str();
179 void ConditionallyResizeOutput(
const std::array< std::size_t, XArrayType::rank::value >& dims, XArrayType* out)
181 auto out_dim = out->GetDimensionArray();
182 bool have_to_resize =
false;
183 for(std::size_t i = 0; i < XArrayType::rank::value; i++)
185 if(out_dim[i] != dims[i])
187 have_to_resize =
true;
192 out->Resize(&(dims[0]));
198 unsigned int fNLocal;
199 unsigned int fNGlobal;
204 MHO_OpenCLNDArrayBuffer< XArrayType >* fArrayBuffer;
MHO_TableContainer< elem_type, ax_pack > data_type
Definition: TestSignalFFT.cc:25
std::string GetKernelPath() const
Definition: MHO_OpenCLInterface.hh:133
cl::Device GetDevice() const
Definition: MHO_OpenCLInterface.hh:119
cl::CommandQueue & GetQueue(int i=-1) const
Definition: MHO_OpenCLInterface.cc:125
static MHO_OpenCLInterface * GetInstance()
Definition: MHO_OpenCLInterface.cc:32
Definition: MHO_OpenCLKernelBuilder.hh:11
cl::Kernel * BuildKernel(std::string SourceFileName, std::string KernelName, std::string BuildFlags=std::string(""))
Definition: MHO_OpenCLKernelBuilder.cc:17
Definition: MHO_OpenCLNDArrayBuffer.hh:19
Definition: MHO_OpenCLScalarMultiply.hh:26
void SetReadFalse()
Definition: MHO_OpenCLScalarMultiply.hh:47
void SetWriteFalse()
Definition: MHO_OpenCLScalarMultiply.hh:54
MHO_OpenCLScalarMultiply()
Definition: MHO_OpenCLScalarMultiply.hh:28
virtual bool ExecuteOutOfPlace(const XArrayType *in, XArrayType *out)
Function ExecuteOutOfPlace.
Definition: MHO_OpenCLScalarMultiply.hh:123
virtual bool InitializeOutOfPlace(const XArrayType *in, XArrayType *out)
Function InitializeOutOfPlace.
Definition: MHO_OpenCLScalarMultiply.hh:117
XFactorType GetFactor() const
Definition: MHO_OpenCLScalarMultiply.hh:40
void SetFactor(XFactorType factor)
Definition: MHO_OpenCLScalarMultiply.hh:38
virtual ~MHO_OpenCLScalarMultiply()
Definition: MHO_OpenCLScalarMultiply.hh:36
void SetWriteTrue()
Definition: MHO_OpenCLScalarMultiply.hh:52
virtual bool InitializeInPlace(XArrayType *in)
Function InitializeInPlace.
Definition: MHO_OpenCLScalarMultiply.hh:57
void SetReadTrue()
Definition: MHO_OpenCLScalarMultiply.hh:45
virtual bool ExecuteInPlace(XArrayType *in)
Function ExecuteInPlace.
Definition: MHO_OpenCLScalarMultiply.hh:91
Class MHO_UnaryOperator.
Definition: MHO_UnaryOperator.hh:24
def dummy(fringe_data_interface)
Definition: example1.py:3
Definition: MHO_ChannelLabeler.hh:17