// OpenCL tutorial 1
#include <iostream>
#include <string>
#include <vector>
#ifdef __APPLE__
#include <OpenCL/opencl.h>
#else
#include <CL/cl.h>
#endif
int main()
{
cl_int err;
cl_uint num;
err = clGetPlatformIDs(0, 0, &num);
if(err != CL_SUCCESS) {
std::cerr << "Unable to get platforms\n";
return 0;
}
std::vector<cl_platform_id> platforms(num);
err = clGetPlatformIDs(num, &platforms[0], &num);
if(err != CL_SUCCESS) {
std::cerr << "Unable to get platform ID\n";
return 0;
}
cl_context_properties prop[] = { CL_CONTEXT_PLATFORM, reinterpret_cast<cl_context_properties>(platforms[0]), 0 };
cl_context context = clCreateContextFromType(prop, CL_DEVICE_TYPE_GPU, NULL, NULL, NULL);
if(context == 0) {
std::cerr << "Can't create OpenCL context\n";
return 0;
}
size_t cb;
clGetContextInfo(context, CL_CONTEXT_DEVICES, 0, NULL, &cb);
std::vector<cl_device_id> devices(cb / sizeof(cl_device_id));
clGetContextInfo(context, CL_CONTEXT_DEVICES, cb, &devices[0], 0);
clGetDeviceInfo(devices[0], CL_DEVICE_NAME, 0, NULL, &cb);
std::string devname;
devname.resize(cb);
clGetDeviceInfo(devices[0], CL_DEVICE_NAME, cb, &devname[0], 0);
std::cout << "Device: " << devname.c_str() << "\n";
clReleaseContext(context);
return 0;
}
Ly8gT3BlbkNMIHR1dG9yaWFsIDEKCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHZlY3Rvcj4KCiNpZmRlZiBfX0FQUExFX18KI2luY2x1ZGUgPE9wZW5DTC9vcGVuY2wuaD4KI2Vsc2UKI2luY2x1ZGUgPENML2NsLmg+CiNlbmRpZgoKCmludCBtYWluKCkKewogICAgICAgIGNsX2ludCBlcnI7CiAgICAgICAgY2xfdWludCBudW07CiAgICAgICAgZXJyID0gY2xHZXRQbGF0Zm9ybUlEcygwLCAwLCAmbnVtKTsKICAgICAgICBpZihlcnIgIT0gQ0xfU1VDQ0VTUykgewogICAgICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJVbmFibGUgdG8gZ2V0IHBsYXRmb3Jtc1xuIjsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICAgICAgc3RkOjp2ZWN0b3I8Y2xfcGxhdGZvcm1faWQ+IHBsYXRmb3JtcyhudW0pOwogICAgICAgIGVyciA9IGNsR2V0UGxhdGZvcm1JRHMobnVtLCAmcGxhdGZvcm1zWzBdLCAmbnVtKTsKICAgICAgICBpZihlcnIgIT0gQ0xfU1VDQ0VTUykgewogICAgICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJVbmFibGUgdG8gZ2V0IHBsYXRmb3JtIElEXG4iOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQoKICAgICAgICBjbF9jb250ZXh0X3Byb3BlcnRpZXMgcHJvcFtdID0geyBDTF9DT05URVhUX1BMQVRGT1JNLCByZWludGVycHJldF9jYXN0PGNsX2NvbnRleHRfcHJvcGVydGllcz4ocGxhdGZvcm1zWzBdKSwgMCB9OwogICAgICAgIGNsX2NvbnRleHQgY29udGV4dCA9IGNsQ3JlYXRlQ29udGV4dEZyb21UeXBlKHByb3AsIENMX0RFVklDRV9UWVBFX0dQVSwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICAgICAgaWYoY29udGV4dCA9PSAwKSB7CiAgICAgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIkNhbid0IGNyZWF0ZSBPcGVuQ0wgY29udGV4dFxuIjsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICAgICAgc2l6ZV90IGNiOwogICAgICAgIGNsR2V0Q29udGV4dEluZm8oY29udGV4dCwgQ0xfQ09OVEVYVF9ERVZJQ0VTLCAwLCBOVUxMLCAmY2IpOwogICAgICAgIHN0ZDo6dmVjdG9yPGNsX2RldmljZV9pZD4gZGV2aWNlcyhjYiAvIHNpemVvZihjbF9kZXZpY2VfaWQpKTsKICAgICAgICBjbEdldENvbnRleHRJbmZvKGNvbnRleHQsIENMX0NPTlRFWFRfREVWSUNFUywgY2IsICZkZXZpY2VzWzBdLCAwKTsKCiAgICAgICAgY2xHZXREZXZpY2VJbmZvKGRldmljZXNbMF0sIENMX0RFVklDRV9OQU1FLCAwLCBOVUxMLCAmY2IpOwogICAgICAgIHN0ZDo6c3RyaW5nIGRldm5hbWU7CiAgICAgICAgZGV2bmFtZS5yZXNpemUoY2IpOwogICAgICAgIGNsR2V0RGV2aWNlSW5mbyhkZXZpY2VzWzBdLCBDTF9ERVZJQ0VfTkFNRSwgY2IsICZkZXZuYW1lWzBdLCAwKTsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkRldmljZTogIiA8PCBkZXZuYW1lLmNfc3RyKCkgPDwgIlxuIjsKCiAgICAgICAgY2xSZWxlYXNlQ29udGV4dChjb250ZXh0KTsKICAgICAgICByZXR1cm4gMDsKfQ==