2022-01-12 00:01:42 +08:00
|
|
|
#ifndef C_STRUCTURES_H
|
|
|
|
#define C_STRUCTURES_H
|
|
|
|
|
2022-05-04 20:59:38 +08:00
|
|
|
#include "cuda_runtime.h"
|
2022-01-12 00:01:42 +08:00
|
|
|
#include "pthread.h"
|
2022-05-04 20:59:38 +08:00
|
|
|
|
2022-01-12 00:01:42 +08:00
|
|
|
typedef struct device {
|
|
|
|
int max_compute_units;
|
|
|
|
int device_id;
|
|
|
|
} cu_device;
|
|
|
|
|
|
|
|
typedef struct c_thread {
|
|
|
|
pthread_t thread;
|
|
|
|
unsigned long executed_commands;
|
|
|
|
unsigned index;
|
|
|
|
bool exit;
|
|
|
|
} cu_ptd;
|
|
|
|
|
|
|
|
typedef struct scheduler_pool {
|
|
|
|
|
|
|
|
struct c_thread *thread_pool;
|
|
|
|
|
|
|
|
size_t num_worker_threads;
|
|
|
|
size_t local_mem_size;
|
|
|
|
int num_kernel_launch;
|
|
|
|
int num_kernel_finished;
|
|
|
|
int num_kernel_queued;
|
|
|
|
size_t idle_threads;
|
|
|
|
|
|
|
|
pthread_cond_t wake_pool;
|
2022-05-04 20:59:38 +08:00
|
|
|
pthread_cond_t wake_host;
|
2022-01-12 00:01:42 +08:00
|
|
|
|
|
|
|
int threadpool_shutdown_requested;
|
|
|
|
|
|
|
|
// lock for scheduler
|
|
|
|
pthread_mutex_t work_queue_lock;
|
|
|
|
|
|
|
|
// C99 array at the end
|
|
|
|
// user kernel queue for only user called functions
|
|
|
|
struct kernel_queue *kernelQueue;
|
|
|
|
|
|
|
|
} cu_pool;
|
|
|
|
|
|
|
|
struct kernel_queue {
|
|
|
|
|
|
|
|
struct kernel *head;
|
|
|
|
struct kernel *tail;
|
|
|
|
|
|
|
|
// finish command count
|
|
|
|
unsigned long finish_count;
|
|
|
|
|
|
|
|
// waiting to be run on threads
|
|
|
|
unsigned long waiting_count;
|
|
|
|
|
|
|
|
// running count
|
|
|
|
unsigned long running_count;
|
|
|
|
|
|
|
|
// total count
|
|
|
|
unsigned long kernel_count;
|
|
|
|
|
|
|
|
// current index for task to be run
|
|
|
|
unsigned long current_index;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct command {
|
|
|
|
|
|
|
|
struct kernel *ker;
|
|
|
|
|
|
|
|
struct command *next;
|
|
|
|
struct command *prev;
|
|
|
|
|
|
|
|
} cu_command;
|
|
|
|
|
|
|
|
typedef struct argument {
|
|
|
|
// size of the argument to allocation
|
|
|
|
size_t size;
|
|
|
|
void *value;
|
|
|
|
unsigned int index;
|
|
|
|
} cu_argument;
|
|
|
|
|
|
|
|
typedef struct input_arg {
|
|
|
|
// real values for the input
|
|
|
|
char *p;
|
|
|
|
struct argument *argus[];
|
|
|
|
// (TODO): implement meta_data
|
|
|
|
// the type of metadata will need to change to list of ints or something
|
|
|
|
// so that we can parse the arguments p
|
|
|
|
} cu_input;
|
|
|
|
|
|
|
|
enum StreamType {
|
|
|
|
DEFAULT,
|
|
|
|
LOW,
|
|
|
|
HIGH,
|
|
|
|
EXT,
|
|
|
|
};
|
|
|
|
|
|
|
|
struct cStreamDataInternal {
|
|
|
|
/*
|
|
|
|
status of the stream (run , wait)
|
|
|
|
Run: Stream will asynchronously assign the kernel assign with this stream
|
|
|
|
Wait: Stream will halt kernels from exiting the scheduler
|
|
|
|
*/
|
|
|
|
int status;
|
|
|
|
/*
|
|
|
|
if status == wait, wait on the number of kernels to wait to become 0
|
|
|
|
*/
|
|
|
|
unsigned long numKernelsToWait;
|
|
|
|
unsigned int lastKernelIdToWait;
|
|
|
|
unsigned int count; // number of task left in the stream
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct streamData {
|
|
|
|
|
|
|
|
// execution status of current event monitor
|
|
|
|
struct cStreamDataInternal ev;
|
|
|
|
pthread_mutex_t stream_lock; // lock on the stream
|
|
|
|
StreamType stream_priority;
|
|
|
|
unsigned int id;
|
|
|
|
unsigned int stream_flags;
|
|
|
|
|
|
|
|
// queue of the kernels in this stream
|
|
|
|
struct kernel_queue *kernelQueue;
|
|
|
|
|
|
|
|
} cstreamData;
|
|
|
|
// kernel information
|
|
|
|
typedef struct kernel {
|
|
|
|
|
|
|
|
void *(*start_routine)(void *);
|
|
|
|
|
|
|
|
void **args;
|
|
|
|
|
|
|
|
dim3 gridDim;
|
|
|
|
dim3 blockDim;
|
|
|
|
|
|
|
|
struct kernel *next;
|
|
|
|
struct kernel *prev;
|
|
|
|
|
|
|
|
size_t shared_mem;
|
|
|
|
|
2022-05-04 20:59:38 +08:00
|
|
|
cudaStream_t stream;
|
2022-01-12 00:01:42 +08:00
|
|
|
|
|
|
|
struct event *barrier;
|
|
|
|
|
|
|
|
int status;
|
|
|
|
|
|
|
|
int totalBlocks;
|
|
|
|
int N;
|
|
|
|
|
|
|
|
int blockSize;
|
|
|
|
int kernelId;
|
|
|
|
|
|
|
|
// current blockId
|
|
|
|
int blockId;
|
|
|
|
|
2022-05-04 20:59:38 +08:00
|
|
|
// execute multiple blocks per fetch
|
|
|
|
int gpu_block_to_execute_per_cpu_thread;
|
2022-01-12 00:01:42 +08:00
|
|
|
|
|
|
|
} cu_kernel;
|
|
|
|
|
|
|
|
typedef struct asyncKernel {
|
|
|
|
unsigned int numBlocks;
|
|
|
|
unsigned int numThreads;
|
|
|
|
struct event *evt;
|
|
|
|
struct kernel *ker;
|
|
|
|
|
|
|
|
struct asyncKernel *prev;
|
|
|
|
struct asyncKernel *next;
|
|
|
|
|
|
|
|
} asyncKernel;
|
|
|
|
|
|
|
|
// command queue of command nodes
|
|
|
|
|
|
|
|
typedef struct kernel_arg_array {
|
|
|
|
size_t size;
|
|
|
|
unsigned int index;
|
|
|
|
} karg_arr;
|
|
|
|
|
|
|
|
typedef struct kernel_image_arg {
|
|
|
|
size_t size;
|
|
|
|
unsigned int index;
|
|
|
|
} k_arg;
|
|
|
|
|
2022-05-04 20:59:38 +08:00
|
|
|
typedef struct callParams {
|
|
|
|
dim3 gridDim;
|
|
|
|
dim3 blockDim;
|
|
|
|
size_t shareMem;
|
|
|
|
void *stream;
|
|
|
|
} callParams;
|
|
|
|
|
2022-01-12 00:01:42 +08:00
|
|
|
#endif // HEADER_FILE
|