瀏覽代碼

mpi/burst_gemm: add warmup GEMM and GEMM without burst

Philippe SWARTVAGHER 5 年之前
父節點
當前提交
63420eb4fe
共有 2 個文件被更改,包括 47 次插入5 次删除
  1. 44 2
      mpi/tests/burst_gemm.c
  2. 3 3
      mpi/tests/gemm_helper.c

+ 44 - 2
mpi/tests/burst_gemm.c

@@ -29,6 +29,9 @@
 #include "gemm_helper.h"
 #include "burst_helper.h"
 
+static int gemm_warmup = 1;
+static int gemm_warmup_wait = 0;
+
 void parse_args(int argc, char **argv)
 {
 	int i;
@@ -62,10 +65,19 @@ void parse_args(int argc, char **argv)
 		{
 			burst_nb_requests = atoi(argv[++i]);
 		}
+		else if (strcmp(argv[i], "-no-gemm-warmup") == 0)
+		{
+			gemm_warmup = 0;
+		}
+		else if (strcmp(argv[i], "-gemm-warmup-wait") == 0)
+		{
+			/* All warmup GEMMs will start at the same moment */
+			gemm_warmup_wait = 1;
+		}
 		else if (strcmp(argv[i], "-help") == 0 || strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-h") == 0)
 		{
-			fprintf(stderr,"Usage: %s [-nblocks n] [-size size] [-check] [-nreqs nreqs]\n", argv[0]);
-			fprintf(stderr,"Currently selected: matrix size: %u - %u blocks - %d requests in each burst\n", matrix_dim, nslices, burst_nb_requests);
+			fprintf(stderr,"Usage: %s [-nblocks n] [-size size] [-check] [-nreqs nreqs] [-no-gemm-warmup] [-gemm-warmup-wait]\n", argv[0]);
+			fprintf(stderr,"Currently selected: matrix size: %u - %u blocks - %d requests in each burst - gemm warmup: %d -gemm-warmup-wait: %d\n", matrix_dim, nslices, burst_nb_requests, gemm_warmup, gemm_warmup_wait);
 			exit(EXIT_SUCCESS);
 		}
 		else
@@ -106,6 +118,24 @@ int main(int argc, char **argv)
 	if (gemm_init_data() == -ENODEV)
 		goto enodev;
 
+	/* GEMM warmup, to really load the BLAS library */
+	if (gemm_warmup)
+	{
+		if (gemm_warmup_wait)
+		{
+			starpu_task_wait_for_all();
+			starpu_pause();
+		}
+
+		if(gemm_submit_tasks() == -ENODEV)
+			goto enodev;
+
+		if (gemm_warmup_wait)
+		{
+			starpu_resume();
+		}
+	}
+
 	burst_init_data(mpi_rank);
 
 	/* Wait for everything and everybody: */
@@ -142,6 +172,18 @@ int main(int argc, char **argv)
 	starpu_task_wait_for_all();
 	starpu_mpi_barrier(MPI_COMM_WORLD);
 
+	starpu_sleep(0.3); // sleep to easily distinguish different parts in traces
+
+	FPRINTF(stderr, "** Workers are computing, without communications **\n");
+	starpu_pause();
+	if(gemm_submit_tasks() == -ENODEV)
+		goto enodev;
+	starpu_resume();
+
+	/* Wait for everything and everybody: */
+	starpu_task_wait_for_all();
+	starpu_mpi_barrier(MPI_COMM_WORLD);
+
 enodev:
 	gemm_release();
 	burst_free_data(mpi_rank);

+ 3 - 3
mpi/tests/gemm_helper.c

@@ -199,6 +199,7 @@ static struct starpu_codelet cl_init_matrix_zero =
 	.color = 0x808000 // olive
 };
 
+/* Allocate and partition buffers */
 void gemm_alloc_data()
 {
 	starpu_malloc_flags((void **)&A, matrix_dim*matrix_dim*sizeof(TYPE), STARPU_MALLOC_PINNED|STARPU_MALLOC_SIMULATION_FOLDED);
@@ -207,14 +208,13 @@ void gemm_alloc_data()
 	partition_mult_data();
 }
 
-
+/* Submit tasks to initialize matrices: fill them with zeros or random numbers */
 int gemm_init_data()
 {
 #ifndef STARPU_SIMGRID
 	int ret;
 	unsigned x, y;
 
-	// Initialize matrices:
 	for (x = 0; x < nslices; x++)
 	{
 		struct starpu_task *task = starpu_task_create();
@@ -237,7 +237,7 @@ int gemm_init_data()
 	return 0;
 }
 
-
+/* Submit tasks to compute the GEMM */
 int gemm_submit_tasks()
 {
 	int ret;