Add nosv multiple-segment test
This commit is contained in:
		
							parent
							
								
									7089db0bd0
								
							
						
					
					
						commit
						fb435842b2
					
				| @ -8,3 +8,4 @@ test_emu(task-types.c MP) | |||||||
| test_emu(pause.c MP) | test_emu(pause.c MP) | ||||||
| test_emu(mp-rank.c MP) | test_emu(mp-rank.c MP) | ||||||
| test_emu(switch-same-type.c) | test_emu(switch-same-type.c) | ||||||
|  | test_emu(multiple-segment.c MP NPROC 4) | ||||||
|  | |||||||
							
								
								
									
										108
									
								
								test/emu/nosv/multiple-segment.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								test/emu/nosv/multiple-segment.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,108 @@ | |||||||
|  | /* Copyright (c) 2023 Barcelona Supercomputing Center (BSC)
 | ||||||
|  |  * SPDX-License-Identifier: GPL-3.0-or-later */ | ||||||
|  | 
 | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <unistd.h> | ||||||
|  | #include "common.h" | ||||||
|  | #include "compat.h" | ||||||
|  | #include "emu_prv.h" | ||||||
|  | #include "instr_nosv.h" | ||||||
|  | #include "ovni.h" | ||||||
|  | 
 | ||||||
|  | /* Number of CPUs per loom, also number of threads per loom */ | ||||||
|  | #define N 2 | ||||||
|  | 
 | ||||||
|  | /* This test executes two apps in two segments of nOS-V, each segment has 2
 | ||||||
|  |  * CPUs, with 2 in total. */ | ||||||
|  | int | ||||||
|  | main(void) | ||||||
|  | { | ||||||
|  | 	int rank = atoi(getenv("OVNI_RANK")); | ||||||
|  | 	int nranks = atoi(getenv("OVNI_NRANKS")); | ||||||
|  | 
 | ||||||
|  | 	if (nranks != 4) | ||||||
|  | 		die("this tests requires 4 ranks"); | ||||||
|  | 
 | ||||||
|  | 	int app = rank / N; | ||||||
|  | 
 | ||||||
|  | 	char loom[128]; | ||||||
|  | 	if (snprintf(loom, 128, "loom.%04d", app) >= 128) | ||||||
|  | 		die("snprintf failed"); | ||||||
|  | 
 | ||||||
|  | 	ovni_proc_init(1 + app, loom, getpid()); | ||||||
|  | 	ovni_proc_set_rank(rank, nranks); | ||||||
|  | 
 | ||||||
|  | 	/* Leader of the segment, must emit CPUs */ | ||||||
|  | 	if (rank % N == 0) { | ||||||
|  | 		int cpus[N]; | ||||||
|  | 		for (int i = 0; i < N; i++) { | ||||||
|  | 			cpus[i] = app * N + i; | ||||||
|  | 			ovni_add_cpu(i, cpus[i]); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	int nlooms = nranks / N; | ||||||
|  | 	int lcpu = rank % N; | ||||||
|  | 
 | ||||||
|  | 	ovni_thread_init(get_tid()); | ||||||
|  | 	instr_thread_execute(lcpu, -1, 0); | ||||||
|  | 
 | ||||||
|  | 	uint32_t typeid = 1; | ||||||
|  | 	instr_nosv_type_create(typeid); | ||||||
|  | 	instr_nosv_task_create(1, typeid); | ||||||
|  | 	instr_nosv_task_execute(1); | ||||||
|  | 	sleep_us(10000); | ||||||
|  | 	instr_nosv_task_end(1); | ||||||
|  | 
 | ||||||
|  | 	instr_end(); | ||||||
|  | 
 | ||||||
|  | 	char pname[128]; | ||||||
|  | 	sprintf(pname, "check-rank-%d.sh", rank); | ||||||
|  | 	FILE *p = fopen(pname, "w"); | ||||||
|  | 	if (p == NULL) | ||||||
|  | 		die("fopen failed:"); | ||||||
|  | 
 | ||||||
|  | 	/* Check the value of the rank and app id of each process is
 | ||||||
|  | 	 * placed in the proper row (keep in mind the virtual CPU). */ | ||||||
|  | 	int row = 1 + rank + app; | ||||||
|  | 
 | ||||||
|  | 	/* TODO: we cannot use the delta clock in all the ranks, as it
 | ||||||
|  | 	 * needs to be corrected to the delta of the first rank. For | ||||||
|  | 	 * now we simply search for the event in the proper row. */ | ||||||
|  | 	fprintf(p, "grep '%d:[0-9]*:%d:%d$' ovni/cpu.prv\n", | ||||||
|  | 			row, PRV_NOSV_APPID, 1 + app); /* Starts at 1 */ | ||||||
|  | 	fprintf(p, "grep '%d:[0-9]*:%d:%d$' ovni/cpu.prv\n", | ||||||
|  | 			row, PRV_NOSV_RANK, 1 + rank); /* Starts at 1 */ | ||||||
|  | 
 | ||||||
|  | 	fclose(p); | ||||||
|  | 
 | ||||||
|  | 	/* Only the rank 0 writes the cpu script */ | ||||||
|  | 	if (rank != 0) | ||||||
|  | 		return 0; | ||||||
|  | 
 | ||||||
|  | 	FILE *c = fopen("cpus", "w"); | ||||||
|  | 	if (c == NULL) | ||||||
|  | 		die("fopen failed:"); | ||||||
|  | 
 | ||||||
|  | 	/* Check that there are exactly 6 rows: two groups of 2 CPUs and
 | ||||||
|  | 	 * 1 vCPU. */ | ||||||
|  | 	for (int l = 0; l < nlooms; l++) { | ||||||
|  | 		for (int i = l * N; i < (l + 1) * N ; i++) { | ||||||
|  | 			fprintf(c, " CPU %d.%d\n", l, i); | ||||||
|  | 		} | ||||||
|  | 		fprintf(c, "vCPU %d.*\n", l); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	fclose(c); | ||||||
|  | 
 | ||||||
|  | 	FILE *f = fopen("check-rows.sh", "w"); | ||||||
|  | 	if (f == NULL) | ||||||
|  | 		die("fopen failed:"); | ||||||
|  | 
 | ||||||
|  | 	fprintf(f, "grep 'CPU' ovni/cpu.row | diff -y cpus -\n"); | ||||||
|  | 
 | ||||||
|  | 	fclose(f); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user