From 3680049029e6a193eae069596be04ce0fb2b1303 Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期六, 05 十一月 2022 17:19:55 +0800
Subject: [PATCH] '增加l2稳定性'

---
 ConsoleApplication/OpenCLExcuter.cpp |  129 +++++++++++++++++++++++++++++++++++++++----
 1 files changed, 117 insertions(+), 12 deletions(-)

diff --git a/ConsoleApplication/OpenCLExcuter.cpp b/ConsoleApplication/OpenCLExcuter.cpp
index 9d6fdc9..4233d5b 100644
--- a/ConsoleApplication/OpenCLExcuter.cpp
+++ b/ConsoleApplication/OpenCLExcuter.cpp
@@ -52,6 +52,96 @@
 
 string OpenCLExcuter::rootPath;
 
+void OpenCLExcuter::reCreateQueue()
+{
+
+	//获取平台
+	error = clGetPlatformIDs(1, &platforms, &num_of_platforms);
+	if (error != 0) {
+		throw string("Get platform failed!");
+	}
+
+	error = clGetDeviceIDs(platforms, CL_DEVICE_TYPE_GPU, 1, &devices, NULL);
+	if (error != 0) {
+		error = clGetDeviceIDs(platforms, CL_DEVICE_TYPE_CPU, 1, &devices, NULL);
+		if (error != CL_SUCCESS) {
+			throw string("Get device failed!");
+		}
+	}
+	//创建上下文
+	context = clCreateContext(NULL, 1, &devices, NULL, NULL, &error);
+	if (error != CL_SUCCESS) {
+		throw string("Creat context failed!");
+	}
+	//创建程序;注意要用"rb"
+	string kernel_path = "";
+	if (rootPath.length() > 0) {
+		kernel_path = kernel_path.append(rootPath);
+	}
+
+	kernel_path.append("kernel.cl");
+	cout << "kernel_path:" << kernel_path << endl;
+	fopen_s(&program_handle, kernel_path.c_str(), "rb");
+
+	if (program_handle == NULL) {
+		throw string("The kernle can not be opened!");
+	}
+	fseek(program_handle, 0, SEEK_END);
+	program_size = ftell(program_handle);
+	rewind(program_handle);
+
+	program_buffer = (char*)malloc(program_size + 1);
+	program_buffer[program_size] = '\0';
+	error = fread(program_buffer, sizeof(char), program_size, program_handle);
+	if (error == 0) {
+		throw string("Read kernel failed!");
+	}
+	fclose(program_handle);
+	program = clCreateProgramWithSource(context, 1, (const char**)&program_buffer,
+		&program_size, &error);
+	if (error < 0) {
+		program = clCreateProgramWithSource(context, 0, (const char**)&program_buffer,
+			&program_size, &error);
+		if (error < 0) {
+			string st = "Couldn't create the program!";
+			st.append("  error:").append(to_string(error));
+			throw st;
+		}
+	}
+	//编译程序
+	error = clBuildProgram(program, 1, &devices, NULL, NULL, NULL);
+	if (error < 0) {
+		//确定日志文件的大小
+		clGetProgramBuildInfo(program, devices, CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size);
+		program_log = (char*)malloc(log_size + 1);
+		program_log[log_size] = '\0';
+		//读取日志
+		clGetProgramBuildInfo(program, devices, CL_PROGRAM_BUILD_LOG,
+			log_size + 1, program_log, NULL);
+		printf("%s\n", program_log);
+		free(program_log);
+		throw string("Build Program Failed");
+	}
+	free(program_buffer);
+
+	//创建命令队列
+	//queue = clCreateCommandQueue(context, devices, CL_QUEUE_PROFILING_ENABLE, &error);
+	queue = clCreateCommandQueueWithProperties(context, devices, 0, &error);
+
+	if (error < 0) {
+		queue = clCreateCommandQueue(context, devices, CL_QUEUE_PROFILING_ENABLE, &error);
+		if (error < 0) {
+			throw string("Coudn't create the command queue");
+		}
+	}
+}
+
+void OpenCLExcuter::excuteError()
+{
+	destory();
+	reCreateQueue();
+}
+
 void OpenCLExcuter::init() {
 	showDeviceInfo();
 	//获取平台
@@ -68,18 +158,19 @@
 	//	}
 	//}
 
+	devices = nullptr;
 
 	error = clGetDeviceIDs(platforms, CL_DEVICE_TYPE_GPU , 1, &devices, NULL);
 	if (error != 0) {
 		error = clGetDeviceIDs(platforms, CL_DEVICE_TYPE_CPU, 1, &devices, NULL);
-		if (error != 0) {
+		if (error != CL_SUCCESS) {
 			throw string("Get device failed!");
 		}
 	}
 
 	//创建上下文
 	context = clCreateContext(NULL, 1, &devices, NULL, NULL, &error);
-	if (error != 0) {
+	if (error != CL_SUCCESS) {
 		throw string("Creat context failed!");
 	}
 	//创建程序;注意要用"rb"
@@ -187,10 +278,10 @@
 	error |= clSetKernelArg(kernel, 5, sizeof(int), &line_number_count);
 	error |= clSetKernelArg(kernel, 6, sizeof(cl_mem), &memObject4);
 	if (error != CL_SUCCESS) {
-		clReleaseKernel(kernel);
 		clReleaseMemObject(memObject1);
 		clReleaseMemObject(memObject2);
 		clReleaseMemObject(memObject4);
+		clReleaseKernel(kernel);
 		throw string("Error setting kernel arguments!\n");
 	}
 	//执行内核
@@ -202,10 +293,10 @@
 	error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize,
 		localWorkSize, 0, NULL, NULL);
 	if (error != CL_SUCCESS) {
-		clReleaseKernel(kernel);
 		clReleaseMemObject(memObject1);
 		clReleaseMemObject(memObject2);
 		clReleaseMemObject(memObject4);
+		clReleaseKernel(kernel);
 		throw string("Error queuing kernel for execution!\n");
 	}
 
@@ -215,10 +306,10 @@
 		result, 0, NULL, NULL);
 	if (error != CL_SUCCESS) {
 		free(result);
-		clReleaseKernel(kernel);
 		clReleaseMemObject(memObject1);
 		clReleaseMemObject(memObject2);
 		clReleaseMemObject(memObject4);
+		clReleaseKernel(kernel);
 		throw string("Error reading result buffer!\n");
 	}
 	/*
@@ -263,12 +354,12 @@
 		localWorkSize, 0, NULL, NULL);
 	if (error != CL_SUCCESS) {
 		free(result);
-		clReleaseKernel(kernel);
 		clReleaseMemObject(memObject1);
 		clReleaseMemObject(memObject2);
 		clReleaseMemObject(memObject4);
 		clReleaseMemObject(memObject21);
 		clReleaseMemObject(memObject22);
+		clReleaseKernel(kernel);
 		throw string("Error queuing kernel for execution!\n");
 	}
 
@@ -279,12 +370,12 @@
 	if (error != CL_SUCCESS) {
 		free(result);
 		free(result2);
-		clReleaseKernel(kernel);
 		clReleaseMemObject(memObject1);
 		clReleaseMemObject(memObject2);
 		clReleaseMemObject(memObject4);
 		clReleaseMemObject(memObject21);
 		clReleaseMemObject(memObject22);
+		clReleaseKernel(kernel);
 		throw string("Error reading result buffer!\n");
 	}
 
@@ -525,6 +616,7 @@
 		clReleaseMemObject(memObject3);
 		clReleaseMemObject(memObject4);
 		clReleaseMemObject(memObject5);
+		excuteError();
 		throw st;
 	}
 	std::cout << " 耗时:" << (clock() - time_0) << std::endl;
@@ -627,6 +719,7 @@
 		clReleaseMemObject(memObject3);
 		clReleaseMemObject(memObject4);
 		clReleaseMemObject(memObject5);
+		excuteError();
 		throw st;
 	}
 
@@ -741,6 +834,7 @@
 		clReleaseMemObject(memObject3);
 		clReleaseMemObject(memObject4);
 		clReleaseMemObject(memObject5);
+		excuteError();
 		throw st;
 	}
 
@@ -847,6 +941,7 @@
 		clReleaseMemObject(memObject2);
 		clReleaseMemObject(memObject3);
 		clReleaseMemObject(memObject4);
+		excuteError();
 		throw st;
 	}
 }
@@ -916,6 +1011,7 @@
 		clReleaseKernel(kernel);
 		clReleaseMemObject(memObject1);
 		clReleaseMemObject(memObject2);
+		excuteError();
 		throw st;
 	}
 
@@ -993,6 +1089,7 @@
 		clReleaseMemObject(memObject1);
 		clReleaseMemObject(memObject2);
 		clReleaseMemObject(memObject3);
+		excuteError();
 		throw st;
 	}
 
@@ -1075,6 +1172,7 @@
 		clReleaseMemObject(memObject1);
 		clReleaseMemObject(memObject2);
 		clReleaseMemObject(memObject3);
+		excuteError();
 		throw st;
 	}
 
@@ -1156,6 +1254,7 @@
 		clReleaseMemObject(memObject1);
 		clReleaseMemObject(memObject2);
 		clReleaseMemObject(memObject3);
+		excuteError();
 		throw st;
 	}
 
@@ -1240,6 +1339,7 @@
 		clReleaseMemObject(memObject1);
 		clReleaseMemObject(memObject2);
 		clReleaseMemObject(memObject3);
+		excuteError();
 		throw st;
 	}
 
@@ -1311,6 +1411,7 @@
 		clReleaseKernel(kernel);
 		clReleaseMemObject(memObject1);
 		clReleaseMemObject(memObject2);
+		excuteError();
 		throw st;
 	}
 
@@ -1372,14 +1473,16 @@
 			throw string("Error reading result buffer!\n");
 		}
 
-		clReleaseKernel(kernel);
+	
 		clReleaseMemObject(memObject1);
 		clReleaseMemObject(memObject2);
+		clReleaseKernel(kernel);
 	}
 	catch (string st) {
-		clReleaseKernel(kernel);
 		clReleaseMemObject(memObject1);
 		clReleaseMemObject(memObject2);
+		clReleaseKernel(kernel);
+		excuteError();
 		throw st;
 	}
 
@@ -1454,6 +1557,7 @@
 		clReleaseKernel(kernel);
 		clReleaseMemObject(memObject1);
 		clReleaseMemObject(memObject2);
+		excuteError();
 		throw st;
 	}
 
@@ -1522,6 +1626,7 @@
 		clReleaseKernel(kernel);
 		clReleaseMemObject(memObject1);
 		clReleaseMemObject(memObject2);
+		excuteError();
 		throw st;
 	}
 
@@ -1532,8 +1637,8 @@
 
 void OpenCLExcuter::destory() {
 	//释放资源
-	clReleaseDevice(devices);
-	clReleaseContext(context);
-	clReleaseProgram(program);
 	clReleaseCommandQueue(queue);
+	clReleaseProgram(program);
+	clReleaseContext(context);
+	clReleaseDevice(devices);
 }
\ No newline at end of file

--
Gitblit v1.8.0