Serene Runtime 1.0.0
C runtime for the Serene programming language
Loading...
Searching...
No Matches
05_parallel.c File Reference
#include <stdatomic.h>
#include <stdio.h>
#include <serene/runtime.h>
Include dependency graph for 05_parallel.c:

Go to the source code of this file.

Macros

#define FIBER_COUNT   1000
 
#define WORKER_COUNT   4
 

Functions

static srn_fiber_result_t increment (srn_context_t *ctx, void *arg)
 
int main (void)
 

Variables

static int ok
 
static atomic_int total
 

Macro Definition Documentation

◆ FIBER_COUNT

#define FIBER_COUNT   1000

Definition at line 39 of file 05_parallel.c.

◆ WORKER_COUNT

#define WORKER_COUNT   4

Definition at line 40 of file 05_parallel.c.

Function Documentation

◆ increment()

static srn_fiber_result_t increment ( srn_context_t * ctx,
void * arg )
static

Definition at line 44 of file 05_parallel.c.

44 {
45 (void)ctx;
46 (void)arg;
47 // The one piece of shared state. An atomic add is safe from any worker.
48 atomic_fetch_add(&total, 1);
49 return &ok;
50}
static int ok
Definition 01_hello.c:36
static atomic_int total
Definition 05_parallel.c:42
Here is the caller graph for this function:

◆ main()

int main ( void )

Definition at line 52 of file 05_parallel.c.

52 {
53 srn_mm_t *mm = srn_mm_init();
54 srn_engine_t *engine = srn_engine_make(mm);
55 srn_context_t *ctx = srn_context_make(engine);
56 srn_scheduler_t *sched = engine->scheduler;
57
58 atomic_store(&total, 0);
59 for (int i = 0; i < FIBER_COUNT; i++) {
60 (void)srn_fiber_make(ctx, sched, increment, nullptr, 0);
61 }
62
63 printf("running %d fibers across %d workers\n", FIBER_COUNT, WORKER_COUNT);
65
66 int counted = atomic_load(&total);
67 printf("counted %d (expected %d): %s\n", counted, FIBER_COUNT,
68 counted == FIBER_COUNT ? "all fibers ran" : "lost an update");
69
71 srn_engine_shutdown(engine);
73 return 0;
74}
#define FIBER_COUNT
Definition 05_parallel.c:39
static srn_fiber_result_t increment(srn_context_t *ctx, void *arg)
Definition 05_parallel.c:44
#define WORKER_COUNT
Definition 05_parallel.c:40
srn_context_t * srn_context_make(srn_engine_t *engine)
Make an empty context, by allocating a new memory block.
Definition context.c:38
int srn_context_release(srn_context_t *ctx)
Definition context.c:63
srn_mm_t * srn_mm_init()
Initialize the memory manager, this function will panic on error.
Definition default.c:294
void srn_mm_shutdown(srn_mm_t *mm)
Shut down the memory manager and release the resources.
Definition default.c:325
srn_engine_t * srn_engine_make(srn_mm_t *mm)
Definition engine.c:92
void srn_engine_shutdown(srn_engine_t *engine)
Definition engine.c:123
srn_fiber_t * srn_fiber_make(srn_context_t *ctx, srn_scheduler_t *sched, srn_fiber_entry_t entry, void *arg, size_t stack_size)
Create a fiber that will run entry(ctx, arg).
Definition fiber.c:169
void srn_sched_run(srn_scheduler_t *sched, int nworkers)
Run the scheduler with nworkers os threads draining it, returning once the pool goes quiescent (every...
Definition scheduler.c:784
Engine is a structure to own the long living and main pieces of the compiler.
Definition engine.h:49
srn_scheduler_t * scheduler
The fiber scheduler, set by srn_sched_init.
Definition engine.h:67
Main memory manager structure that will own all the allocated blocks and data.
Definition interface.h:112
Here is the call graph for this function:

Variable Documentation

◆ ok

int ok
static

Definition at line 37 of file 05_parallel.c.

◆ total

atomic_int total
static

Definition at line 42 of file 05_parallel.c.