浏览代码

The helper functions to allocate/liberate pinned memory use tasks internally,
so they are blocking.

Cédric Augonnet 15 年之前
父节点
当前提交
6f21718f48
共有 2 个文件被更改,包括 14 次插入4 次删除
  1. 2 2
      include/starpu-data.h
  2. 12 2
      src/util/malloc.c

+ 2 - 2
include/starpu-data.h

@@ -46,8 +46,8 @@ void starpu_advise_if_data_is_important(struct starpu_data_state_t *state, unsig
 int starpu_sync_data_with_mem(struct starpu_data_state_t *state);
 int starpu_notify_data_modification(struct starpu_data_state_t *state, uint32_t modifying_node);
 
-void starpu_malloc_pinned_if_possible(void **A, size_t dim);
-void starpu_free_pinned_if_possible(void *A);
+int starpu_malloc_pinned_if_possible(void **A, size_t dim);
+int starpu_free_pinned_if_possible(void *A);
 
 int starpu_request_data_allocation(struct starpu_data_state_t *state, uint32_t node);
 

+ 12 - 2
src/util/malloc.c

@@ -48,8 +48,11 @@ static starpu_codelet malloc_pinned_cl = {
 };
 #endif
 
-void starpu_malloc_pinned_if_possible(void **A, size_t dim)
+int starpu_malloc_pinned_if_possible(void **A, size_t dim)
 {
+	if (STARPU_UNLIKELY(!worker_may_perform_blocking_calls()))
+		return -EDEADLK;
+
 	STARPU_ASSERT(A);
 
 	if (may_submit_cuda_task())
@@ -78,6 +81,8 @@ void starpu_malloc_pinned_if_possible(void **A, size_t dim)
 	}
 
 	STARPU_ASSERT(*A);
+
+	return 0;
 }
 
 #ifdef USE_CUDA
@@ -97,8 +102,11 @@ static starpu_codelet free_pinned_cl = {
 };
 #endif
 
-void starpu_free_pinned_if_possible(void *A)
+int starpu_free_pinned_if_possible(void *A)
 {
+	if (STARPU_UNLIKELY(!worker_may_perform_blocking_calls()))
+		return -EDEADLK;
+
 	if (may_submit_cuda_task())
 	{
 #ifdef USE_CUDA
@@ -118,4 +126,6 @@ void starpu_free_pinned_if_possible(void *A)
 	else {
 		free(A);
 	}
+
+	return 0;
 }