浏览代码

src/drivers/opencl: properly release memory and opencl objects

Nathalie Furmento 9 年之前
父节点
当前提交
adaea43e58
共有 2 个文件被更改,包括 23 次插入3 次删除
  1. 17 3
      src/drivers/opencl/driver_opencl.c
  2. 6 0
      src/drivers/opencl/driver_opencl_utils.c

+ 17 - 3
src/drivers/opencl/driver_opencl.c

@@ -2,7 +2,7 @@
  *
  * Copyright (C) 2010-2015  Université de Bordeaux
  * Copyright (C) 2010  Mehdi Juhoor <mjuhoor@gmail.com>
- * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015  CNRS
+ * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016  CNRS
  * Copyright (C) 2011  Télécom-SudParis
  *
  * StarPU is free software; you can redistribute it and/or modify
@@ -218,22 +218,34 @@ int _starpu_opencl_deinit_context(int devid)
 
         _STARPU_DEBUG("De-initialising context for dev %d\n", devid);
 
-        err = clReleaseContext(contexts[devid]);
+        err = clFinish(queues[devid]);
         if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err);
-
         err = clReleaseCommandQueue(queues[devid]);
         if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err);
 
+        err = clFinish(in_transfer_queues[devid]);
+        if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err);
         err = clReleaseCommandQueue(in_transfer_queues[devid]);
         if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err);
+
+        err = clFinish(out_transfer_queues[devid]);
+        if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err);
         err = clReleaseCommandQueue(out_transfer_queues[devid]);
         if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err);
+
+        err = clFinish(peer_transfer_queues[devid]);
+        if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err);
         err = clReleaseCommandQueue(peer_transfer_queues[devid]);
         if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err);
 
+        err = clFinish(alloc_queues[devid]);
+        if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err);
         err = clReleaseCommandQueue(alloc_queues[devid]);
         if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err);
 
+        err = clReleaseContext(contexts[devid]);
+        if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err);
+
         contexts[devid] = NULL;
 
 	STARPU_PTHREAD_MUTEX_UNLOCK(&big_lock);
@@ -703,6 +715,8 @@ int _starpu_opencl_driver_run_once(struct _starpu_worker *worker)
 		else
 		{
 #ifndef STARPU_SIMGRID
+			err = clReleaseEvent(task_events[worker->devid][worker->first_task]);
+			if (STARPU_UNLIKELY(err)) STARPU_OPENCL_REPORT_ERROR(err);
 			task_events[worker->devid][worker->first_task] = 0;
 #endif
 

+ 6 - 0
src/drivers/opencl/driver_opencl_utils.c

@@ -318,7 +318,9 @@ int _starpu_opencl_compile_or_load_opencl_from_string(const char *opencl_program
 
 		// Store program
 		if (opencl_programs)
+		{
 			opencl_programs->programs[dev] = program;
+		}
 		else
 		{
 			char binary_file_name[1024];
@@ -347,6 +349,9 @@ int _starpu_opencl_compile_or_load_opencl_from_string(const char *opencl_program
 			fclose(fh);
 			free(binary);
 			_STARPU_DEBUG("File <%s> created\n", binary_file_name);
+
+			err = clReleaseProgram(program);
+			if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err);
 		}
 	}
 	return EXIT_SUCCESS;
@@ -485,6 +490,7 @@ int starpu_opencl_load_binary_opencl(const char *kernel_id, struct starpu_opencl
 
 		// Store program
 		opencl_programs->programs[dev] = program;
+		free(binary);
 	}
 	return 0;
 }