OpenCL* for CPU
Ask questions and share information on Intel® SDK for OpenCL™ Applications and OpenCL™ implementations for Intel® CPU.
Announcements
This forum covers OpenCL* for CPU only. OpenCL* for GPU questions can be asked in the GPU Compute Software forum. Intel® FPGA SDK for OpenCL™ questions can be ask in the FPGA Intel® High Level Design forum.
1718 Discussions

-g option to clBuildProgram not accepted

dozo1971
Beginner
737 Views
Hi,

I'm trying to debug some OpenCL kernels with the Intel OpenCL SDK debugger integrated in VS2008.
The documentation states I have to pass "-g -s " as an option to clBuildProgram() but this results in a CL_BUILD_ERRORerror "Don't understand command line argument "-g"!".

DoI need another OpenCL.dll driver? I've tried it bothon an AMD as a NVIDIA system.

Thanks,
Daniel Dekkers
0 Kudos
6 Replies
Yuri_K_Intel
Employee
737 Views
Hello Daniel,

Could you please make sure that your program selects Intel OpenCL platform during initialization. It looks like you have multiple OpenCL platforms installed on your system (since you are mentioning AMD and NVIDIA).

Thanks,
Yuri
0 Kudos
dozo1971
Beginner
737 Views
Hi Yuri,

Good point, wrote some code to check.
I havetwo OpenCL platforms:
The first platformis AMD, it has two devices, Caicos and Intel Core i7
The second platform is Intel OpenCL, it has one device, Intel Core i7 (same name as above)

So i guess i should use the second platform?

Thanks,
Daniel
0 Kudos
Yuri_K_Intel
Employee
737 Views
Yes, exactly. To work with the Intel OpenCL kernel debugger you should use Intel platform.

Thanks,
Yuri
0 Kudos
dozo1971
Beginner
737 Views
Ok, I'm doing that but now clCreateContext() never returns...

m_Context = clCreateContext(NULL, 1, &m_DeviceId, NULL, NULL, &l_Error);

... where m_DeviceId is the (only) device on the second Intel platform.

I've activated the "Enable OpenCL Kernel Debugging" check.
Windows firewall is turned off.
I'mlinking againstthe OpenCL.lib from the Intel OpenCL SDK.
In taskmanageri see a icldbgsrv.exe (Intel OpenCL Debugger) process, but nothingelse that could be related.

Ehm...

Thanks,
Daniel





0 Kudos
Jim_Vaughn
Beginner
737 Views
Here is some utility code that I helped out on it shows you how you can make sure and get a context for the correct platform and vendor using the Khronos C++ wrapper which you can easily modify to work with the c version as the opencl wrapper will return the base data.

You can either use the clCreateContext with the vendor enum or use arguments version.

Note: This code isn't meant to handle every single possible option (clearly as we don't handle IBM, or Img Tech, or any others). I have included it here as it should show you how to write something similar for yourself so you can never/almost never worry about this stuff again and get to coding.

Also it is way shorted with the C++ wrapper.

If you want to see the rest it is at: https://github.com/smistad/OpenCLUtilities
enum cl_vendor {
VENDOR_ANY,
VENDOR_NVIDIA,
VENDOR_AMD,
VENDOR_INTEL
};

cl::Platform getPlatform(cl_device_type type, cl_vendor vendor) {
// Get available platforms
cl::vector<:PLATFORM> platforms;
cl::Platform::get(&platforms);
if(platforms.size() == 0)
throw cl::Error(1, "No OpenCL platforms were found");
int platformID = -1;
if(vendor != VENDOR_ANY) {
std::string find;
switch(vendor) {
case VENDOR_NVIDIA:
find = "NVIDIA";
break;
case VENDOR_AMD:
find = "Advanced Micro Devices";
break;
case VENDOR_INTEL:
find = "Intel";
break;
default:
throw cl::Error(1, "Invalid vendor specified");
break;
}
for(unsigned int i = 0; i < platforms.size(); i++) {
if(platforms.getInfo().find(find) != std::string::npos) {
try {
cl::vector<:DEVICE> devices;
platforms.getDevices(type, &devices);
platformID = i;
break;
} catch(cl::Error e) {
continue;
}
}
}
} else {
for(unsigned int i = 0; i < platforms.size(); i++) {
try {
cl::vector<:DEVICE> devices;
platforms.getDevices(type, &devices);
platformID = i;
break;
} catch(cl::Error e) {
continue;
}
}
}
if(platformID == -1)
throw cl::Error(1, "No compatible OpenCL platform found");
cl::Platform platform = platforms[platformID];
std::cout << "Using platform vendor: " << platform.getInfo() << std::endl;
return platform;
}
cl::Context createCLContextFromArguments(int argc, char ** argv) {
cl_device_type type = CL_DEVICE_TYPE_ALL;
cl_vendor vendor = VENDOR_ANY;
for(int i = 0; i < argc; i++) {
if(strcmp(argv, "--device") == 0) {
if(strcmp(argv[i+1], "cpu") == 0) {
type = CL_DEVICE_TYPE_CPU;
} else if(strcmp(argv[i+1], "gpu") == 0) {
type = CL_DEVICE_TYPE_GPU;
}
i++;
} else if(strcmp(argv, "--vendor") == 0) {
if(strcmp(argv[i+1], "amd") == 0) {
vendor = VENDOR_AMD;
} else if(strcmp(argv[i+1], "intel") == 0) {
vendor = VENDOR_INTEL;
} else if(strcmp(argv[i+1], "nvidia") == 0) {
vendor = VENDOR_NVIDIA;
}
i++;
}
}
return createCLContext(type, vendor);
}
cl::Context createCLContext(cl_device_type type, cl_vendor vendor) {
cl::Platform platform = getPlatform(type, vendor);
// Use the preferred platform and create a context
cl_context_properties cps[] = {
CL_CONTEXT_PLATFORM,
(cl_context_properties)(platform)(),
0
};
try {
cl::Context context = cl::Context(type, cps);
return context;
} catch(cl::Error error) {
throw cl::Error(1, "Failed to create an OpenCL context!");
}
}

Let me know if you have any quesitons
0 Kudos
Eli_Bendersky__Intel
737 Views
Hi Daniel,

Just to be clear, does your code work with the Intel OpenCL device without debugging?
0 Kudos
Reply