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