#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cstdlib>
#include <fstream>
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#ifdef __APPLE__
#include <OpenCL/opencl.h>
#else
#include <CL/cl.h>
#endif
using namespace cv;
using namespace std;
cl_program load_program(cl_context context, const char* filename)
{
std::ifstream in(filename, std::ios_base::binary);
if (!in.good()) {
return 0;
}
// get file length
in.seekg(0, std::ios_base::end);
size_t length = in.tellg();
in.seekg(0, std::ios_base::beg);
// read program source
std::vector<char> data(length + 1);
in.read(&data[0], length);
data[length] = 0;
// create and build program
const char* source = &data[0];
cl_program program = clCreateProgramWithSource(context, 1, &source, 0, 0);
if (program == 0) {
return 0;
}
if (clBuildProgram(program, 0, 0, 0, 0, 0) != CL_SUCCESS) {
return 0;
}
return program;
}
/////
cl_command_queue queue;
cl_context context;
cl_int err;
cl_uint num;
/////
int detecDEVPLA(){
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 };
context = clCreateContextFromType(prop, CL_DEVICE_TYPE_DEFAULT, 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";
queue = clCreateCommandQueue(context, devices[0], 0, 0);
if (queue == 0) {
std::cerr << "Can't create command queue\n";
clReleaseContext(context);
return 0;
}
}
int main(int argc, char** argv){
Mat image;
detecDEVPLA(); //detec device and platform
char img_name[50]="";
strcpy(img_name,"8K.jpg");
image = imread(img_name, CV_LOAD_IMAGE_COLOR);
LARGE_INTEGER t1, t2, ts;
QueryPerformanceFrequency(&ts);
QueryPerformanceCounter(&t1);
int DATA_SIZE = image.cols * image.rows*image.channels();
uchar *data;
data = image.ptr<uchar>(0);
cl_mem cl_data = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(cl_uchar) * DATA_SIZE, image.ptr(0), NULL);
cl_mem cl_res = clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(cl_uchar) * DATA_SIZE, NULL, NULL);
if (cl_data == 0 || cl_res == 0) {
std::cerr << "Can't create OpenCL buffer\n";
clReleaseMemObject(cl_data);
clReleaseMemObject(cl_res);
clReleaseCommandQueue(queue);
clReleaseContext(context);
system("pause");
return 0;
}
cl_program program = load_program(context, "BGR2GRAY.cl");
if (program == 0) {
std::cerr << "Can't load or build program\n";
clReleaseMemObject(cl_data);
clReleaseMemObject(cl_res);
clReleaseCommandQueue(queue);
clReleaseContext(context);
system("pause");
return 0;
}
cl_kernel adder = clCreateKernel(program, "adder", 0);
if (adder == 0) {
std::cerr << "Can't load kernel\n";
clReleaseProgram(program);
clReleaseMemObject(cl_data);
clReleaseMemObject(cl_res);
clReleaseCommandQueue(queue);
clReleaseContext(context);
system("pause");
return 0;
}
clSetKernelArg(adder, 0, sizeof(cl_mem), &cl_data);
clSetKernelArg(adder, 1, sizeof(cl_mem), &cl_res);
size_t work_item_size = DATA_SIZE / 3;
err = clEnqueueNDRangeKernel(queue, adder, 1, 0, &work_item_size, 0, 0, 0, 0);
Mat After_image = Mat::zeros(Size(image.cols, image.rows), CV_8UC3);
uchar *GRAY;
GRAY = After_image.ptr<uchar>(0);
if (err == CL_SUCCESS) {
err = clEnqueueReadBuffer(queue, cl_res, CL_TRUE, 0, sizeof(uchar) * DATA_SIZE, After_image.ptr(0), 0, 0, 0);
}
QueryPerformanceCounter(&t2);
imshow("result", After_image);
imwrite("GRAY_8K.jpg",After_image);
ofstream time_result;
time_result.open("GPU_result_time.txt",ofstream::out|ofstream::app);
time_result<<"GPU processing "<<img_name<<" time : "<<((t2.QuadPart - t1.QuadPart) / (double)(ts.QuadPart))<<" sec "<<endl;
time_result.close();
return 0;
}
I2luY2x1ZGU8b3BlbmN2Mi9jb3JlL2NvcmUuaHBwPgojaW5jbHVkZTxvcGVuY3YyL2hpZ2hndWkvaGlnaGd1aS5ocHA+CiNpbmNsdWRlPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxmc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGZzdHJlYW0+CiNpbmNsdWRlIDx3aW5kb3dzLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CgojaWZkZWYgX19BUFBMRV9fCiNpbmNsdWRlIDxPcGVuQ0wvb3BlbmNsLmg+CiNlbHNlCiNpbmNsdWRlIDxDTC9jbC5oPgojZW5kaWYKdXNpbmcgbmFtZXNwYWNlIGN2Owp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCmNsX3Byb2dyYW0gbG9hZF9wcm9ncmFtKGNsX2NvbnRleHQgY29udGV4dCwgY29uc3QgY2hhciogZmlsZW5hbWUpCnsKCXN0ZDo6aWZzdHJlYW0gaW4oZmlsZW5hbWUsIHN0ZDo6aW9zX2Jhc2U6OmJpbmFyeSk7CglpZiAoIWluLmdvb2QoKSkgewoJCXJldHVybiAwOwoJfQoKCS8vIGdldCBmaWxlIGxlbmd0aAoJaW4uc2Vla2coMCwgc3RkOjppb3NfYmFzZTo6ZW5kKTsKCXNpemVfdCBsZW5ndGggPSBpbi50ZWxsZygpOwoJaW4uc2Vla2coMCwgc3RkOjppb3NfYmFzZTo6YmVnKTsKCgkvLyByZWFkIHByb2dyYW0gc291cmNlCglzdGQ6OnZlY3RvcjxjaGFyPiBkYXRhKGxlbmd0aCArIDEpOwoJaW4ucmVhZCgmZGF0YVswXSwgbGVuZ3RoKTsKCWRhdGFbbGVuZ3RoXSA9IDA7CgoJLy8gY3JlYXRlIGFuZCBidWlsZCBwcm9ncmFtIAoJY29uc3QgY2hhciogc291cmNlID0gJmRhdGFbMF07CgljbF9wcm9ncmFtIHByb2dyYW0gPSBjbENyZWF0ZVByb2dyYW1XaXRoU291cmNlKGNvbnRleHQsIDEsICZzb3VyY2UsIDAsIDApOwoJaWYgKHByb2dyYW0gPT0gMCkgewoJCXJldHVybiAwOwoJfQoKCWlmIChjbEJ1aWxkUHJvZ3JhbShwcm9ncmFtLCAwLCAwLCAwLCAwLCAwKSAhPSBDTF9TVUNDRVNTKSB7CgkJcmV0dXJuIDA7Cgl9CgoJcmV0dXJuIHByb2dyYW07Cn0KCi8vLy8vCmNsX2NvbW1hbmRfcXVldWUgcXVldWU7CmNsX2NvbnRleHQgY29udGV4dDsKY2xfaW50IGVycjsKY2xfdWludCBudW07Ci8vLy8vCmludCBkZXRlY0RFVlBMQSgpewoKCWVyciA9IGNsR2V0UGxhdGZvcm1JRHMoMCwgMCwgJm51bSk7CglpZiAoZXJyICE9IENMX1NVQ0NFU1MpIHsKCQlzdGQ6OmNlcnIgPDwgIlVuYWJsZSB0byBnZXQgcGxhdGZvcm1zXG4iOwoJCXJldHVybiAwOwoJfQoKCXN0ZDo6dmVjdG9yPGNsX3BsYXRmb3JtX2lkPiBwbGF0Zm9ybXMobnVtKTsKCWVyciA9IGNsR2V0UGxhdGZvcm1JRHMobnVtLCAmcGxhdGZvcm1zWzBdLCAmbnVtKTsKCWlmIChlcnIgIT0gQ0xfU1VDQ0VTUykgewoJCXN0ZDo6Y2VyciA8PCAiVW5hYmxlIHRvIGdldCBwbGF0Zm9ybSBJRFxuIjsKCQlyZXR1cm4gMDsKCX0KCWNsX2NvbnRleHRfcHJvcGVydGllcyBwcm9wW10gPSB7IENMX0NPTlRFWFRfUExBVEZPUk0sIHJlaW50ZXJwcmV0X2Nhc3Q8Y2xfY29udGV4dF9wcm9wZXJ0aWVzPihwbGF0Zm9ybXNbMF0pLCAwIH07Cgljb250ZXh0ID0gY2xDcmVhdGVDb250ZXh0RnJvbVR5cGUocHJvcCwgQ0xfREVWSUNFX1RZUEVfREVGQVVMVCwgTlVMTCwgTlVMTCwgTlVMTCk7CglpZiAoY29udGV4dCA9PSAwKSB7CgkJc3RkOjpjZXJyIDw8ICJDYW4ndCBjcmVhdGUgT3BlbkNMIGNvbnRleHRcbiI7CgkJcmV0dXJuIDA7Cgl9CgoKCglzaXplX3QgY2I7CgljbEdldENvbnRleHRJbmZvKGNvbnRleHQsIENMX0NPTlRFWFRfREVWSUNFUywgMCwgTlVMTCwgJmNiKTsKCXN0ZDo6dmVjdG9yPGNsX2RldmljZV9pZD4gZGV2aWNlcyhjYiAvIHNpemVvZihjbF9kZXZpY2VfaWQpKTsKCWNsR2V0Q29udGV4dEluZm8oY29udGV4dCwgQ0xfQ09OVEVYVF9ERVZJQ0VTLCBjYiwgJmRldmljZXNbMF0sIDApOwoJY2xHZXREZXZpY2VJbmZvKGRldmljZXNbMF0sIENMX0RFVklDRV9OQU1FLCAwLCBOVUxMLCAmY2IpOwoJc3RkOjpzdHJpbmcgZGV2bmFtZTsKCWRldm5hbWUucmVzaXplKGNiKTsKCWNsR2V0RGV2aWNlSW5mbyhkZXZpY2VzWzBdLCBDTF9ERVZJQ0VfTkFNRSwgY2IsICZkZXZuYW1lWzBdLCAwKTsKCXN0ZDo6Y291dCA8PCAiRGV2aWNlOiAiIDw8IGRldm5hbWUuY19zdHIoKSA8PCAiXG4iOwoKCXF1ZXVlID0gY2xDcmVhdGVDb21tYW5kUXVldWUoY29udGV4dCwgZGV2aWNlc1swXSwgMCwgMCk7CglpZiAocXVldWUgPT0gMCkgewoJCXN0ZDo6Y2VyciA8PCAiQ2FuJ3QgY3JlYXRlIGNvbW1hbmQgcXVldWVcbiI7CgkJY2xSZWxlYXNlQ29udGV4dChjb250ZXh0KTsKCQlyZXR1cm4gMDsKCX0KCn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndil7CglNYXQgaW1hZ2U7CgoKCglkZXRlY0RFVlBMQSgpOwkJLy9kZXRlYyBkZXZpY2UgYW5kIHBsYXRmb3JtCgoKCWNoYXIgaW1nX25hbWVbNTBdPSIiOwoKCXN0cmNweShpbWdfbmFtZSwiOEsuanBnIik7CglpbWFnZSA9IGltcmVhZChpbWdfbmFtZSwgQ1ZfTE9BRF9JTUFHRV9DT0xPUik7CglMQVJHRV9JTlRFR0VSIHQxLCB0MiwgdHM7CglRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCZ0cyk7CglRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmdDEpOwogCgoKCglpbnQgREFUQV9TSVpFID0gaW1hZ2UuY29scyAqIGltYWdlLnJvd3MqaW1hZ2UuY2hhbm5lbHMoKTsKCgoKCXVjaGFyICpkYXRhOwoJZGF0YSA9IGltYWdlLnB0cjx1Y2hhcj4oMCk7CgoKCWNsX21lbSBjbF9kYXRhID0gY2xDcmVhdGVCdWZmZXIoY29udGV4dCwgQ0xfTUVNX1JFQURfT05MWSB8IENMX01FTV9DT1BZX0hPU1RfUFRSLCBzaXplb2YoY2xfdWNoYXIpICogREFUQV9TSVpFLCBpbWFnZS5wdHIoMCksIE5VTEwpOwoJY2xfbWVtIGNsX3JlcyA9IGNsQ3JlYXRlQnVmZmVyKGNvbnRleHQsIENMX01FTV9XUklURV9PTkxZLCBzaXplb2YoY2xfdWNoYXIpICogREFUQV9TSVpFLCBOVUxMLCBOVUxMKTsKCgoJaWYgKGNsX2RhdGEgPT0gMCB8fCBjbF9yZXMgPT0gMCkgewoJCXN0ZDo6Y2VyciA8PCAiQ2FuJ3QgY3JlYXRlIE9wZW5DTCBidWZmZXJcbiI7CgkJY2xSZWxlYXNlTWVtT2JqZWN0KGNsX2RhdGEpOwoJCWNsUmVsZWFzZU1lbU9iamVjdChjbF9yZXMpOwoJCWNsUmVsZWFzZUNvbW1hbmRRdWV1ZShxdWV1ZSk7CgkJY2xSZWxlYXNlQ29udGV4dChjb250ZXh0KTsKCQlzeXN0ZW0oInBhdXNlIik7CgkJcmV0dXJuIDA7Cgl9CgoJY2xfcHJvZ3JhbSBwcm9ncmFtID0gbG9hZF9wcm9ncmFtKGNvbnRleHQsICJCR1IyR1JBWS5jbCIpOwoKCWlmIChwcm9ncmFtID09IDApIHsKCQlzdGQ6OmNlcnIgPDwgIkNhbid0IGxvYWQgb3IgYnVpbGQgcHJvZ3JhbVxuIjsKCQljbFJlbGVhc2VNZW1PYmplY3QoY2xfZGF0YSk7CgkJY2xSZWxlYXNlTWVtT2JqZWN0KGNsX3Jlcyk7CgkJY2xSZWxlYXNlQ29tbWFuZFF1ZXVlKHF1ZXVlKTsKCQljbFJlbGVhc2VDb250ZXh0KGNvbnRleHQpOwoJCXN5c3RlbSgicGF1c2UiKTsKCQlyZXR1cm4gMDsKCX0KCgljbF9rZXJuZWwgYWRkZXIgPSBjbENyZWF0ZUtlcm5lbChwcm9ncmFtLCAiYWRkZXIiLCAwKTsKCWlmIChhZGRlciA9PSAwKSB7CgkJc3RkOjpjZXJyIDw8ICJDYW4ndCBsb2FkIGtlcm5lbFxuIjsKCQljbFJlbGVhc2VQcm9ncmFtKHByb2dyYW0pOwoJCWNsUmVsZWFzZU1lbU9iamVjdChjbF9kYXRhKTsKCQljbFJlbGVhc2VNZW1PYmplY3QoY2xfcmVzKTsKCQljbFJlbGVhc2VDb21tYW5kUXVldWUocXVldWUpOwoJCWNsUmVsZWFzZUNvbnRleHQoY29udGV4dCk7CgkJc3lzdGVtKCJwYXVzZSIpOwoJCXJldHVybiAwOwoJfQoKCWNsU2V0S2VybmVsQXJnKGFkZGVyLCAwLCBzaXplb2YoY2xfbWVtKSwgJmNsX2RhdGEpOwoJY2xTZXRLZXJuZWxBcmcoYWRkZXIsIDEsIHNpemVvZihjbF9tZW0pLCAmY2xfcmVzKTsKCglzaXplX3Qgd29ya19pdGVtX3NpemUgPSBEQVRBX1NJWkUgLyAzOwoJZXJyID0gY2xFbnF1ZXVlTkRSYW5nZUtlcm5lbChxdWV1ZSwgYWRkZXIsIDEsIDAsICZ3b3JrX2l0ZW1fc2l6ZSwgMCwgMCwgMCwgMCk7CgoKCU1hdCBBZnRlcl9pbWFnZSA9IE1hdDo6emVyb3MoU2l6ZShpbWFnZS5jb2xzLCBpbWFnZS5yb3dzKSwgQ1ZfOFVDMyk7Cgl1Y2hhciAqR1JBWTsKCUdSQVkgPSBBZnRlcl9pbWFnZS5wdHI8dWNoYXI+KDApOwoKCWlmIChlcnIgPT0gQ0xfU1VDQ0VTUykgewoJCWVyciA9IGNsRW5xdWV1ZVJlYWRCdWZmZXIocXVldWUsIGNsX3JlcywgQ0xfVFJVRSwgMCwgc2l6ZW9mKHVjaGFyKSAqIERBVEFfU0laRSwgQWZ0ZXJfaW1hZ2UucHRyKDApLCAwLCAwLCAwKTsKCX0KCglRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmdDIpOwoJaW1zaG93KCJyZXN1bHQiLCBBZnRlcl9pbWFnZSk7CglpbXdyaXRlKCJHUkFZXzhLLmpwZyIsQWZ0ZXJfaW1hZ2UpOwoKCW9mc3RyZWFtIHRpbWVfcmVzdWx0OwoJdGltZV9yZXN1bHQub3BlbigiR1BVX3Jlc3VsdF90aW1lLnR4dCIsb2ZzdHJlYW06Om91dHxvZnN0cmVhbTo6YXBwKTsKCXRpbWVfcmVzdWx0PDwiR1BVIHByb2Nlc3NpbmcgIjw8aW1nX25hbWU8PCIgdGltZSAgIDogICI8PCgodDIuUXVhZFBhcnQgLSB0MS5RdWFkUGFydCkgLyAoZG91YmxlKSh0cy5RdWFkUGFydCkpPDwiIHNlYyAiPDxlbmRsOwoJdGltZV9yZXN1bHQuY2xvc2UoKTsKCgoJcmV0dXJuIDA7Cgl9