Ver código fonte

Avoid making GPU workers drive disks, particularly when using synchronous IO

Samuel Thibault 6 anos atrás
pai
commit
821cbcf1b8
1 arquivos alterados com 23 adições e 5 exclusões
  1. 23 5
      src/core/disk.c

+ 23 - 5
src/core/disk.c

@@ -2,7 +2,7 @@
  *
  * Copyright (C) 2013,2017                                Inria
  * Copyright (C) 2015-2017                                CNRS
- * Copyright (C) 2013-2015,2017,2018                      Université de Bordeaux
+ * Copyright (C) 2013-2015,2017,2018-2019                 Université de Bordeaux
  * Copyright (C) 2013                                     Corentin Salingue
  *
  * StarPU is free software; you can redistribute it and/or modify
@@ -87,14 +87,32 @@ int starpu_disk_register(struct starpu_disk_ops *func, void *parameter, starpu_s
                 _starpu_register_bus(numa_node, disk_memnode);
         }
 
-	/* workers can manage disk memnode */
+	/* Any worker can manage disk memnode */
 	struct _starpu_machine_config *config = _starpu_get_machine_config();
 	unsigned worker;
 	for (worker = 0; worker < starpu_worker_get_count(); worker++)
 	{
-		struct _starpu_worker *workerarg = &config->workers[worker];
-		_starpu_memory_node_add_nworkers(disk_memnode);
-		_starpu_worker_drives_memory_node(workerarg, disk_memnode);
+		/* But prefer to use only CPU workers if possible */
+		if (starpu_worker_get_type(worker) == STARPU_CPU_WORKER)
+		{
+			struct _starpu_worker *workerarg = &config->workers[worker];
+			_starpu_memory_node_add_nworkers(disk_memnode);
+			_starpu_worker_drives_memory_node(workerarg, disk_memnode);
+		}
+	}
+
+	if (!_starpu_memory_node_get_nworkers(disk_memnode))
+	{
+		/* Bleh, no CPU worker to drive the disk, use non-CPU workers too */
+		for (worker = 0; worker < starpu_worker_get_count(); worker++)
+		{
+			if (starpu_worker_get_type(worker) != STARPU_CPU_WORKER)
+			{
+				struct _starpu_worker *workerarg = &config->workers[worker];
+				_starpu_memory_node_add_nworkers(disk_memnode);
+				_starpu_worker_drives_memory_node(workerarg, disk_memnode);
+			}
+		}
 	}
 
 	//Add bus for disk <-> disk copy