mirror of
https://github.com/ggerganov/llama.cpp.git
synced 2025-01-03 15:24:35 +00:00
avoid malloc/free in critial path
This commit is contained in:
parent
455f6f79bc
commit
921296c0d5
11
ggml.c
11
ggml.c
@ -2731,6 +2731,7 @@ enum ggml_task_type {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct ggml_compute_params {
|
struct ggml_compute_params {
|
||||||
|
job newjob;
|
||||||
enum ggml_task_type type;
|
enum ggml_task_type type;
|
||||||
|
|
||||||
int ith, nth;
|
int ith, nth;
|
||||||
@ -9529,11 +9530,11 @@ void ggml_graph_compute(struct ggml_context * ctx, struct ggml_cgraph * cgraph)
|
|||||||
|
|
||||||
// INIT
|
// INIT
|
||||||
struct ggml_compute_params params = {
|
struct ggml_compute_params params = {
|
||||||
/*.type =*/ GGML_TASK_INIT,
|
.type = GGML_TASK_INIT,
|
||||||
/*.ith =*/ 0,
|
.ith = 0,
|
||||||
/*.nth =*/ node->n_tasks,
|
.nth = node->n_tasks,
|
||||||
/*.wsize =*/ cgraph->work ? ggml_nbytes(cgraph->work) : 0,
|
.wsize = cgraph->work ? ggml_nbytes(cgraph->work) : 0,
|
||||||
/*.wdata =*/ cgraph->work ? cgraph->work->data : NULL,
|
.wdata = cgraph->work ? cgraph->work->data : NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
ggml_compute_forward(¶ms, node);
|
ggml_compute_forward(¶ms, node);
|
||||||
|
23
thpool.c
23
thpool.c
@ -156,14 +156,6 @@ typedef struct bsem {
|
|||||||
} bsem;
|
} bsem;
|
||||||
|
|
||||||
|
|
||||||
/* Job */
|
|
||||||
typedef struct job{
|
|
||||||
struct job* prev; /* pointer to previous job */
|
|
||||||
void (*function)(void* arg); /* function pointer */
|
|
||||||
void* arg; /* function's argument */
|
|
||||||
} job;
|
|
||||||
|
|
||||||
|
|
||||||
/* Job queue */
|
/* Job queue */
|
||||||
typedef struct jobqueue{
|
typedef struct jobqueue{
|
||||||
pthread_mutex_t rwmutex; /* used for queue r/w access */
|
pthread_mutex_t rwmutex; /* used for queue r/w access */
|
||||||
@ -279,18 +271,8 @@ struct thpool_* thpool_init(int num_threads){
|
|||||||
|
|
||||||
|
|
||||||
/* Add work to the thread pool */
|
/* Add work to the thread pool */
|
||||||
int thpool_add_work(thpool_* thpool_p, void (*function_p)(void*), void* arg_p){
|
int thpool_add_work(thpool_* thpool_p, void (*function_p)(void*), job * newjob){
|
||||||
job* newjob;
|
|
||||||
|
|
||||||
newjob=(struct job*)malloc(sizeof(struct job));
|
|
||||||
if (newjob==NULL){
|
|
||||||
err("thpool_add_work(): Could not allocate memory for new job\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* add function and argument */
|
|
||||||
newjob->function=function_p;
|
newjob->function=function_p;
|
||||||
newjob->arg=arg_p;
|
|
||||||
|
|
||||||
/* add job to queue */
|
/* add job to queue */
|
||||||
jobqueue_push(&thpool_p->jobqueue, newjob);
|
jobqueue_push(&thpool_p->jobqueue, newjob);
|
||||||
@ -460,9 +442,8 @@ static void* thread_do(struct thread* thread_p){
|
|||||||
job* job_p = jobqueue_pull(&thpool_p->jobqueue);
|
job* job_p = jobqueue_pull(&thpool_p->jobqueue);
|
||||||
if (job_p) {
|
if (job_p) {
|
||||||
func_buff = job_p->function;
|
func_buff = job_p->function;
|
||||||
arg_buff = job_p->arg;
|
arg_buff = job_p;
|
||||||
func_buff(arg_buff);
|
func_buff(arg_buff);
|
||||||
free(job_p);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(&thpool_p->thcount_lock);
|
pthread_mutex_lock(&thpool_p->thcount_lock);
|
||||||
|
8
thpool.h
8
thpool.h
@ -16,6 +16,12 @@ extern "C" {
|
|||||||
|
|
||||||
typedef struct thpool_* threadpool;
|
typedef struct thpool_* threadpool;
|
||||||
|
|
||||||
|
/* Job */
|
||||||
|
typedef struct job{
|
||||||
|
struct job* prev; /* pointer to previous job */
|
||||||
|
void (*function)(void* arg); /* function pointer */
|
||||||
|
} job;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Initialize threadpool
|
* @brief Initialize threadpool
|
||||||
@ -64,7 +70,7 @@ threadpool thpool_init(int num_threads);
|
|||||||
* @param arg_p pointer to an argument
|
* @param arg_p pointer to an argument
|
||||||
* @return 0 on success, -1 otherwise.
|
* @return 0 on success, -1 otherwise.
|
||||||
*/
|
*/
|
||||||
int thpool_add_work(threadpool, void (*function_p)(void*), void* arg_p);
|
int thpool_add_work(threadpool, void (*function_p)(void*), job *newjob);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user