gem5/splash2/codes/apps/radiosity/task.H
Sanchayan Maity 2fcc51c2c1 Commit splash2 benchmark
While at it also add the libpthread static library amd m5op_x86
for matrix multiplication test code as well.

Note that the splash2 benchmark code does not comply with gem5
coding guidelines. Academic guys never seem to follow 80 columns
and no whitespace guideline :(.
2017-04-26 20:50:15 +05:30

169 lines
5.2 KiB
C

/*************************************************************************/
/* */
/* Copyright (c) 1994 Stanford University */
/* */
/* All rights reserved. */
/* */
/* Permission is given to use, copy, and modify this software for any */
/* non-commercial purpose as long as this copyright notice is not */
/* removed. All other uses, including redistribution in whole or in */
/* part, are forbidden without prior written permission. */
/* */
/* This software is provided with absolutely no warranty and no */
/* support. */
/* */
/*************************************************************************/
#ifndef _TASK_H
#define _TASK_H
/************************************************************************
*
* Constants
*
*************************************************************************/
#define PAGE_SIZE 4096 /* page size of system, used for padding to
allow page placement of some logically
per-process data structures */
/*** Task types ***/
#define TASK_MODELING (1)
#define TASK_BSP (2)
#define TASK_FF_REFINEMENT (4)
#define TASK_RAY (8)
#define TASK_RAD_AVERAGE (16)
#define TASK_VISIBILITY (32)
/*** Controling parallelism ***/
#define MAX_TASKGET_RETRY (32) /* Max # of retry get_task() can make */
#define N_ALLOCATE_LOCAL_TASK (8) /* get_task() and free_task() transfer
this # of task objects to/from the
global shared queue at a time */
/************************************************************************
*
* Task Descriptors
*
*************************************************************************/
/* Decompose modeling object into patches (B-reps) */
typedef struct {
long type ; /* Object type */
Model *model ; /* Object to be decomposed */
} Modeling_Task ;
/* Insert a new patch to the BSP tree */
typedef struct {
Patch *patch ; /* Patch to be inserted */
Patch *parent ; /* Parent node in the BSP tree */
} BSP_Task ;
/* Refine element interaction based on FF value or BF value */
typedef struct {
Element *e1, *e2 ; /* Interacting elements */
float visibility ; /* Visibility of parent */
long level ; /* Path length from the root element */
} Refinement_Task ;
typedef struct {
long ray_type ;
Element *e ; /* The element we are interested in */
} Ray_Task ;
typedef struct {
Element *e ; /* The element we are interested in */
Interaction *inter ; /* Top of interactions */
long n_inter ; /* Number of interactions */
void (*k)() ; /* Continuation */
} Visibility_Task ;
/* Radiosity averaging task */
#define RAD_AVERAGING_MODE (0)
#define RAD_NORMALIZING_MODE (1)
typedef struct {
Element *e ;
long level ;
long mode ;
} RadAvg_Task ;
/************************************************************************
*
* Task Definition
*
*************************************************************************/
typedef struct _task {
long task_type ;
struct _task *next ;
union {
Modeling_Task model ;
BSP_Task bsp ;
Refinement_Task ref ;
Ray_Task ray ;
Visibility_Task vis ;
RadAvg_Task rad ;
} task ;
} Task ;
typedef struct {
char pad1[PAGE_SIZE]; /* padding to avoid false-sharing
and allow page-placement */
LOCKDEC(q_lock)
Task *top, *tail ;
long n_tasks ;
LOCKDEC(f_lock)
long n_free ;
Task *free ;
char pad2[PAGE_SIZE]; /* padding to avoid false-sharing
and allow page-placement */
} Task_Queue ;
#define TASK_APPEND (0)
#define TASK_INSERT (1)
#define taskq_length(q) (q->n_tasks)
#define taskq_top(q) (q->top)
#define taskq_too_long(q) ((q)->n_tasks > n_tasks_per_queue)
/*
* taskman.C
*/
void process_tasks(long process_id);
long _process_task_wait_loop(void);
void create_modeling_task(Model *model, long type, long process_id);
void create_bsp_task(Patch *patch, Patch *parent, long process_id);
void create_ff_refine_task(Element *e1, Element *e2, long level, long process_id);
void create_ray_task(Element *e, long process_id);
void enqueue_ray_task(long qid, Element *e, long mode, long process_id);
void create_visibility_tasks(Element *e, void (*k)(), long process_id);
void create_radavg_task(Element *e, long mode, long process_id);
void enqueue_radavg_task(long qid, Element *e, long mode, long process_id);
void enqueue_task(long qid, Task *task, long mode);
Task *dequeue_task(long qid, long max_visit, long process_id);
Task *get_task(long process_id);
void free_task(Task *task, long process_id);
void init_taskq(long process_id);
long check_task_counter(void);
long assign_taskq(long process_id);
void print_task(Task *task);
void print_taskq(Task_Queue *tq);
#endif