Added a function to set the OpenCL kernel standard, either 1.1 or 1.2

pull/357/head
Cedric Nugteren 2019-05-11 20:39:00 +02:00
parent 9cbffc9b7c
commit af6a9eedd1
5 changed files with 19 additions and 1 deletions

View File

@ -485,7 +485,6 @@ class Program {
// Compiles the device program and checks whether or not there are any warnings/errors
void Build(const Device &device, std::vector<std::string> &options) {
options.push_back("-cl-std=CL1.1");
auto options_string = std::accumulate(options.begin(), options.end(), std::string{" "});
const cl_device_id dev = device();
CheckError(clBuildProgram(program_, 1, &dev, options_string.c_str(), nullptr, nullptr));

View File

@ -97,6 +97,7 @@ void Routine::InitProgram(std::initializer_list<const char *> source) {
&has_binary);
if (has_binary) {
program_ = std::make_shared<Program>(device_, context_, binary);
SetOpenCLKernelStandard(device_, options);
program_->Build(device_, options);
ProgramCache::Instance().Store(ProgramKey{ context_(), device_(), precision_, routine_info },
std::shared_ptr<Program>{program_});

View File

@ -111,6 +111,7 @@ std::shared_ptr<Program> CompileFromSource(
// Compiles the kernel
auto program = std::make_shared<Program>(context, kernel_string);
try {
SetOpenCLKernelStandard(device, options);
program->Build(device, options);
} catch (const CLCudaAPIBuildError &e) {
if (program->StatusIsCompilationWarningOrError(e.status()) && !silent) {

View File

@ -498,6 +498,19 @@ std::string GetDeviceName(const Device& device) {
// =================================================================================================
void SetOpenCLKernelStandard(const Device &device, std::vector<std::string> &options) {
// Inclusion of one of the following extensions needs OpenCL 1.2 kernels
if (device.HasExtension(kKhronosIntelSubgroups)) {
options.push_back("-cl-std=CL1.2");
}
// Otherwise we fall-back to the default CLBlast OpenCL 1.1
else {
options.push_back("-cl-std=CL1.1");
}
}
// =================================================================================================
// Solve Bezout's identity
// a * p + b * q = r = GCD(a, b)
void EuclidGCD(int a, int b, int &p, int &q, int &r) {

View File

@ -375,6 +375,10 @@ std::string GetDeviceName(const Device& device);
// =================================================================================================
void SetOpenCLKernelStandard(const Device &device, std::vector<std::string> &options);
// =================================================================================================
// Solve Bezout's identity
// a * p + b * q = r = GCD(a, b)
void EuclidGCD(int a, int b, int &p, int &q, int &r);