Prevents implicit conversions to go undetected, as they will have to be explicit now.
		
			
				
	
	
		
			78 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Copyright (c) 2021-2024 Barcelona Supercomputing Center (BSC)
 | |
|  * SPDX-License-Identifier: GPL-3.0-or-later */
 | |
| 
 | |
| #include <nanos6.h>
 | |
| #include <nanos6/debug.h>
 | |
| #include <stdatomic.h>
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include <unistd.h>
 | |
| 
 | |
| static int ncpus = -1;
 | |
| static long nruns = 3L;
 | |
| static long ntasks = 200L;
 | |
| 
 | |
| static atomic_int nhandles = 0;
 | |
| static void **handle;
 | |
| 
 | |
| #pragma oss task
 | |
| static void
 | |
| do_task(int t)
 | |
| {
 | |
| 	handle[t] = nanos6_get_current_blocking_context();
 | |
| 	if (handle[t] == NULL)
 | |
| 		abort();
 | |
| 
 | |
| 	atomic_fetch_add(&nhandles, 1);
 | |
| 	nanos6_block_current_task(handle[t]);
 | |
| }
 | |
| 
 | |
| static void
 | |
| do_run(void)
 | |
| {
 | |
| 	memset(handle, 0, (size_t) ntasks * sizeof(void *));
 | |
| 	atomic_store(&nhandles, 0);
 | |
| 
 | |
| 	for (int t = 0; t < ntasks; t++)
 | |
| 		do_task(t);
 | |
| 
 | |
| 	/* Wait for all tasks to fill the handle */
 | |
| 	while (atomic_load(&nhandles) < ntasks)
 | |
| 		;
 | |
| 
 | |
| 	/* Is ok if we call unblock before the block happens */
 | |
| 	for (int t = 0; t < ntasks; t++) {
 | |
| 		if (handle[t] == NULL)
 | |
| 			abort();
 | |
| 
 | |
| 		nanos6_unblock_task(handle[t]);
 | |
| 	}
 | |
| 
 | |
| 	#pragma oss taskwait
 | |
| }
 | |
| 
 | |
| static int
 | |
| get_ncpus(void)
 | |
| {
 | |
| 	return (int) nanos6_get_num_cpus();
 | |
| }
 | |
| 
 | |
| int
 | |
| main(void)
 | |
| {
 | |
| 	ncpus = get_ncpus();
 | |
| 
 | |
| 	handle = calloc((size_t) ntasks, sizeof(void *));
 | |
| 
 | |
| 	if (handle == NULL) {
 | |
| 		perror("calloc failed");
 | |
| 		return -1;
 | |
| 	}
 | |
| 
 | |
| 	for (int run = 0; run < nruns; run++)
 | |
| 		do_run();
 | |
| 
 | |
| 	return 0;
 | |
| }
 |