Untitled
unknown
plain_text
3 years ago
1.9 kB
9
Indexable
static thread_ret_t ggml_graph_compute_thread(void * data) {
struct ggml_compute_state * state = (struct ggml_compute_state *) data;
const int n_threads = state->shared->n_threads;
while (true) {
if (atomic_fetch_add(&state->shared->n_ready, 1) == n_threads - 1) {
atomic_store(&state->shared->has_work, false);
pthread_cond_broadcast(&state->shared->cv);
} else {
pthread_mutex_lock(&state->shared->mutex);
while (atomic_load(&state->shared->has_work)) {
if (atomic_load(&state->shared->stop)) {
pthread_mutex_unlock(&state->shared->mutex);
return 0;
}
pthread_cond_wait(&state->shared->cv, &state->shared->mutex);
// ggml_lock_lock (&state->shared->spin);
// ggml_lock_unlock(&state->shared->spin);
}
pthread_mutex_unlock(&state->shared->mutex);
}
atomic_fetch_sub(&state->shared->n_ready, 1);
// wait for work
pthread_mutex_lock(&state->shared->mutex);
while (!atomic_load(&state->shared->has_work)) {
if (atomic_load(&state->shared->stop)) {
pthread_mutex_unlock(&state->shared->mutex);
return 0;
}
pthread_cond_wait(&state->shared->cv, &state->shared->mutex);
// ggml_lock_lock (&state->shared->spin);
// ggml_lock_unlock(&state->shared->spin);
}
pthread_mutex_unlock(&state->shared->mutex);
// check if we should stop
if (atomic_load(&state->shared->stop)) {
break;
}
if (state->node) {
if (state->params.ith < state->params.nth) {
ggml_compute_forward(&state->params, state->node);
}
state->node = NULL;
} else {
break;
}
}
return 0;
}Editor is loading...