return it->offset; // we found it!
}
- Program::Program(void) {}
+ Program::Program(void) : constantSet(NULL) {}
Program::~Program(void) {
for (auto &kernel : kernels) GBE_DELETE(kernel.second);
+ if (constantSet) delete constantSet;
}
BVAR(OCL_OUTPUT_GEN_IR, false);
}
bool Program::buildFromUnit(const ir::Unit &unit, std::string &error) {
+ constantSet = new ir::ConstantSet(unit.getConstantSet());
const auto &set = unit.getFunctionSet();
const uint32_t kernelNum = set.size();
if (OCL_OUTPUT_GEN_IR) std::cout << unit;
return p;
}
+ static size_t programGetGlobalConstantSize(gbe_program gbeProgram) {
+ if (gbeProgram == NULL) return 0;
+ const gbe::Program *program = (const gbe::Program*) gbeProgram;
+ return program->getGlobalConstantSize();
+ }
+
+ static void programGetGlobalConstantData(gbe_program gbeProgram, char *mem) {
+ if (gbeProgram == NULL) return;
+ const gbe::Program *program = (const gbe::Program*) gbeProgram;
+ program->getGlobalConstantData(mem);
+ }
+
static uint32_t programGetKernelNum(gbe_program gbeProgram) {
if (gbeProgram == NULL) return 0;
const gbe::Program *program = (const gbe::Program*) gbeProgram;
GBE_EXPORT_SYMBOL gbe_program_new_from_source_cb *gbe_program_new_from_source = NULL;
GBE_EXPORT_SYMBOL gbe_program_new_from_binary_cb *gbe_program_new_from_binary = NULL;
GBE_EXPORT_SYMBOL gbe_program_new_from_llvm_cb *gbe_program_new_from_llvm = NULL;
+GBE_EXPORT_SYMBOL gbe_program_get_global_constant_size_cb *gbe_program_get_global_constant_size = NULL;
+GBE_EXPORT_SYMBOL gbe_program_get_global_constant_data_cb *gbe_program_get_global_constant_data = NULL;
GBE_EXPORT_SYMBOL gbe_program_delete_cb *gbe_program_delete = NULL;
GBE_EXPORT_SYMBOL gbe_program_get_kernel_num_cb *gbe_program_get_kernel_num = NULL;
GBE_EXPORT_SYMBOL gbe_program_get_kernel_by_name_cb *gbe_program_get_kernel_by_name = NULL;
{
CallBackInitializer(void) {
gbe_program_new_from_source = gbe::programNewFromSource;
+ gbe_program_get_global_constant_size = gbe::programGetGlobalConstantSize;
+ gbe_program_get_global_constant_data = gbe::programGetGlobalConstantData;
gbe_program_delete = gbe::programDelete;
gbe_program_get_kernel_num = gbe::programGetKernelNum;
gbe_program_get_kernel_by_name = gbe::programGetKernelByName;
GBE_CURBE_GROUP_NUM_X,
GBE_CURBE_GROUP_NUM_Y,
GBE_CURBE_GROUP_NUM_Z,
+ GBE_CURBE_GLOBAL_CONSTANT_OFFSET,
+ GBE_CURBE_GLOBAL_CONSTANT_DATA,
GBE_CURBE_IMAGE_WIDTH,
GBE_CURBE_IMAGE_HEIGHT,
GBE_CURBE_IMAGE_DEPTH,
size_t *err_size);
extern gbe_program_new_from_llvm_cb *gbe_program_new_from_llvm;
+/*! Get the size of global constants */
+typedef size_t (gbe_program_get_global_constant_size_cb)(gbe_program gbeProgram);
+extern gbe_program_get_global_constant_size_cb *gbe_program_get_global_constant_size;
+
+/*! Get the content of global constants */
+typedef void (gbe_program_get_global_constant_data_cb)(gbe_program gbeProgram, char *mem);
+extern gbe_program_get_global_constant_data_cb *gbe_program_get_global_constant_data;
+
/*! Destroy and deallocate the given program */
typedef void (gbe_program_delete_cb)(gbe_program);
extern gbe_program_delete_cb *gbe_program_delete;
#include "backend/program.h"
#include "backend/context.hpp"
+#include "ir/constant.hpp"
+#include "ir/unit.hpp"
#include "sys/hash_map.hpp"
#include "sys/vector.hpp"
#include <string>
bool buildFromLLVMFile(const char *fileName, std::string &error);
/*! Buils a program from a OCL string */
bool buildFromSource(const char *source, std::string &error);
+ /*! Get size of the global constant arrays */
+ size_t getGlobalConstantSize(void) const { return constantSet->getDataSize(); }
+ /*! Get the content of global constant arrays */
+ void getGlobalConstantData(char *mem) const { constantSet->getData(mem); }
protected:
/*! Compile a kernel */
virtual Kernel *compileKernel(const ir::Unit &unit, const std::string &name) = 0;
/*! Kernels sorted by their name */
hash_map<std::string, Kernel*> kernels;
+ /*! Global (constants) outside any kernel */
+ ir::ConstantSet *constantSet;
/*! Use custom allocators */
GBE_CLASS(Program);
};