25 #include <Base/Common/BIASpragma.hh>
26 #include <Base/Common/FileHandling.hh>
27 #include <OpenCLFramework/clfProgram.hh>
28 #include <OpenCLFramework/clfException.hh>
31 #include <Base/Debug/Error.hh>
32 #include <bias_config.h>
38 std::vector<std::string> clfProgram::additionalsourcedirs_;
44 addWriteMultiplier_ =
false;
48 (*devices_)[0].getInfo( (cl_device_info)CL_DEVICE_IMAGE2D_MAX_HEIGHT, &testHeight);
49 (*devices_)[0].getInfo( (cl_device_info)CL_DEVICE_NAME, &name);
50 if (testHeight == 16383) {
51 if (name ==
"GeForce GTX 285") {
52 BIASWARNONCE(
"you seem to have a gfx card with _image_write_coordinate_ bug (fkellner)");
53 addWriteMultiplier_ =
true;
59 for (
unsigned i=0;i<sources_.size();i++) {
60 delete[] sources_[i].first;
65 string sourcedb = kernelsourcesdb_.GetSource(filename);
66 if (sourcedb.length()>0) {
67 AddSourceFromString(sourcedb);
71 filename = BIAS_SOURCE_DIR+filename;
74 additionalsourcedirs_.push_back(
"D:\\DeCS\\decs-src\\KEMScan");
75 for (
unsigned int i=0;i<additionalsourcedirs_.size();i++) {
77 filename = additionalsourcedirs_[i]+filename;
83 std::string err =
"source file could not be found: "+filename;
84 THROW_CL_EXCEPTION(cl::Error(-100, err.c_str()));
88 ifstream sourceFile(filename.c_str());
89 string sourceCode(istreambuf_iterator<char>(sourceFile), (istreambuf_iterator<char>()));
90 if (sourceCode.length() == 0) {
91 std::string err =
"source length = 0 for file "+filename;
92 THROW_CL_EXCEPTION(cl::Error(-100, err.c_str()));
94 sourcedb = sourceCode;
95 AddSourceFromString(sourceCode);
101 if (sourceCode.length() == 0){
102 std::string err =
"source length = 0 for source "+sourceCode;
103 THROW_CL_EXCEPTION(cl::Error(-100, err.c_str()));
105 if (addWriteMultiplier_) {
106 sourceCode =
"#define XM 2\n"+sourceCode;
108 sourceCode =
"#define XM 1\n"+sourceCode;
110 char *code =
new char[sourceCode.length()];
111 memcpy(code, sourceCode.c_str(), sourceCode.length());
112 sources_.push_back(make_pair(code, sourceCode.length()));
116 program_ = cl::Program(*context_, sources_);
119 if (options.length() == 0) {
120 error = program_.build(*devices_);
122 error = program_.build(*devices_, options.c_str());
124 }
catch (cl::Error &err) {
126 cl_build_status bs = program_.getBuildInfo<CL_PROGRAM_BUILD_STATUS> (
127 (*devices_)[deviceNr]);
128 log+=
"Build status:\t";
134 log+=
"Build error\n";
136 case CL_BUILD_SUCCESS:
139 case CL_BUILD_IN_PROGRESS:
140 log+=
"Build in progress\n";
148 log+= program_.getBuildInfo<CL_PROGRAM_BUILD_LOG>((*devices_)[deviceNr])+
"\n";
149 THROW_CL_EXCEPTION(cl::Error(-100, log.c_str()));
154 return program_.getBuildInfo<CL_PROGRAM_BUILD_LOG>((*devices_)[deviceNr]);
160 if (kernels_.find(kernelname) != kernels_.end()) {
164 kernels_.insert(make_pair(kernelname, cl::Kernel(program_, kernelname.c_str() )));
165 }
catch (cl::Error &err) {
166 cout<<
"Kernelname:"<<kernelname<<endl;
167 THROW_CL_EXCEPTION(err);
172 for (
unsigned int i=0;i<kernelnames.size();i++) {
173 AddKernel(kernelnames[i]);
179 kernels_[ kernelname ].setArg( argnumber, buffer.
buffer() );
180 }
catch (cl::Error &err) {
181 THROW_CL_EXCEPTION(err);
187 kernels_[ kernelname ].setArg( argnumber, buffer.
image() );
188 }
catch (cl::Error &err) {
189 THROW_CL_EXCEPTION(err);
193 #define CLFIMPL_CL_TYPE(type) \
194 void clfProgram::KernelSetArgument(std::string kernelname, unsigned int argnumber, type arg) { \
196 kernels_[ kernelname ].setArg( argnumber, arg ); \
197 } catch (cl::Error &err) { \
198 THROW_CL_EXCEPTION(err); \
217 void clfProgram::KernelSetArgument(std::
string kernelname,
unsigned int argnumber,
int arg) {
219 kernels_[ kernelname ].setArg( argnumber, arg );
220 }
catch (cl::Error &err) {
221 THROW_CL_EXCEPTION(err);
227 kernels_[ kernelname ].setArg( argnumber, arg );
228 }
catch (cl::Error &err) {
229 THROW_CL_EXCEPTION(err);
237 kernels_[ kernelname ].setArg( argnumber, arg );
238 }
catch (cl::Error &err) {
239 THROW_CL_EXCEPTION(err);
246 kernels_[ kernelname ].setArg( argnumber, size, NULL );
247 }
catch (cl::Error &err) {
248 THROW_CL_EXCEPTION(err);
254 if (kernels_.find(kernelname) == kernels_.end()) {
255 string err =
"can not find kernel of name "+kernelname;
256 THROW_CL_EXCEPTION(cl::Error(-100, err.c_str()));
258 return kernels_[ kernelname ];
std::string AddSource(std::string filename)
adds source code from a file
void KernelSetLocalArgument(std::string kernelname, unsigned int argnumber, int size)
void Build(int deviceNr=0, std::string options="")
builds the sources added by AddSource and AddSourceFromString
void AddSourceFromString(std::string sourceCode)
adds source code from a string
static bool FileExists(const std::string &file)
Check if the given file exists.
cl::Image2D & image() const
void KernelSetArgument(std::string kernelname, unsigned int argnumber, clfBuffer &buffer)
set kernel argument
std::string GetBuildLog(int deviceNr=0)
void AddKernel(std::string kernelname)
adds a kernel to the program.
clfProgram(cl::Context *context, std::vector< cl::Device > *devices)
cl::Kernel & operator()(std::string kernelname)
void AddKernels(std::vector< std::string > kernelnames)
adds a vector of kernels to the program.