webassembly003 ggml GGML Tensor Library part-3

关于pthread_create()和pthread_join()

#include <stdio.h>
#include <pthread.h>void *thread_func(void *arg) {int *num = (int *)arg;printf("Hello from thread! arg=%d\n", *num);pthread_exit(NULL);
}int main() {pthread_t thread;int arg = 10;if (pthread_create(&thread, NULL, thread_func, &arg) != 0) {printf("Failed to create thread\n");return 1;}if (pthread_join(thread, NULL) != 0) {printf("Failed to join thread\n");return 1;}printf("Main thread ends\n");return 0;
}

         是否是在pthread_join后线程才会执行?
         不是。在线程创建后,可以立即执行线程函数。但是如果在主线程中调用了pthread_join函数,主线程会等待被等待的线程执行完毕后再继续执行。所以在pthread_join函数之后,被等待的线程才会执行完毕。
在这里插入图片描述
         但是初始化的参数(比如以下片段中的node)是错误的,如何使得不计算出错呢?

            workers[j] = (struct ggml_compute_state) {.thrd   = 0,.params = {.type  = GGML_TASK_COMPUTE,.ith   = j + 1,.nth   = n_threads,.wsize = cgraph->work ? ggml_nbytes(cgraph->work) : 0,.wdata = cgraph->work ? cgraph->work->data : NULL,},.node   = NULL,.shared = &state_shared,};int rc = pthread_create(&workers[j].thrd, NULL, ggml_graph_compute_thread, &workers[j]);

        自旋锁;自旋锁的指的是线程在获取锁时,如果发现锁已经被其他线程占用,会进入一个忙等待的状态,不断地检查锁是否被释放。这个过程称为旋转,因为线程会像旋转一样不断地尝试获取锁,直到成功为止。旋转是一种快速的等待方式,可以减少线程切换的开销,但也会消耗CPU资源。
        项目使用自旋锁当参数被正确设置之后才会执行

thread_ret_t ggml_graph_compute_thread(void * data) {//将data指针转换为ggml_compute_state类型的指针state。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);//则将 has_work 设置为 false} else {// 如果 has_work 为 true,则等待直到 has_work 变为 falsewhile (atomic_load(&state->shared->has_work)) {// 如果 stop 为 true,则返回 0if (atomic_load(&state->shared->stop)) {return 0;}ggml_lock_lock  (&state->shared->spin);ggml_lock_unlock(&state->shared->spin);}}atomic_fetch_sub(&state->shared->n_ready, 1);// 等待有工作要做while (!atomic_load(&state->shared->has_work)) {// 如果 stop 为 true,则返回 0if (atomic_load(&state->shared->stop)) {return 0;}ggml_lock_lock  (&state->shared->spin);ggml_lock_unlock(&state->shared->spin);}// 检查是否应该停止if (atomic_load(&state->shared->stop)) {break;}// 执行计算并将 state->node 设置为 NULLif (state->node) {ggml_compute_forward(&state->params, state->node);state->node = NULL;} else {break;}}return 0;
}

     在非阶段 GGML_TASK_INIT , GGML_TASK_FINALIZE执行运算

void ggml_compute_forward_add_f32(const struct ggml_compute_params * params,const struct ggml_tensor * src0,const struct ggml_tensor * src1,struct ggml_tensor * dst) {GGML_ASSERT(ggml_are_same_shape(src0, src1) && ggml_are_same_shape(src0, dst));if (params->type == GGML_TASK_INIT || params->type == GGML_TASK_FINALIZE) {return;}const int ith = params->ith;const int nth = params->nth;const int n  = ggml_nrows(src0);const int nc = src0->ne[0];const size_t nb00 = src0->nb[0];const size_t nb01 = src0->nb[1];const size_t nb10 = src1->nb[0];const size_t nb11 = src1->nb[1];const size_t nb0 = dst->nb[0];const size_t nb1 = dst->nb[1];GGML_ASSERT( nb0 == sizeof(float));GGML_ASSERT(nb00 == sizeof(float));if (nb10 == sizeof(float)) {const int j0 = (n/nth)*ith;const int j1 = ith == nth - 1 ? n : (n/nth)*(ith + 1);for (int j = j0; j < j1; j++) {ggml_vec_add_f32(nc,(float *) ((char *) dst->data  + j*nb1),(float *) ((char *) src0->data + j*nb01),(float *) ((char *) src1->data + j*nb11));}} else {// src1 is not contiguousfor (int j = ith; j < n; j += nth) {float * dst_ptr  = (float *) ((char *) dst->data  + j*nb1);float * src0_ptr = (float *) ((char *) src0->data + j*nb01);for (int i = 0; i < nc; i++) {float * src1_ptr = (float *) ((char *) src1->data + j*nb11 + i*nb10);dst_ptr[i] = src0_ptr[i] + *src1_ptr;}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1620909.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构--树4.2(二叉树)

目录 一、二叉树的定义和特点 1、定义 2、特点 二、二叉树的基本形态 1、空二叉树 2、只有一个根结点 3、根结点只有左子树 4、根结点只有右子树 5、根结点既有左子树又有右子树 6、斜树 7、满二叉树 8、满二叉树和完全二叉树 三、二叉树的性质 一、二叉树的定义和…

Presto之Driver个数

一. 前言 在Presto的Stage Performace中&#xff0c;每个Operator中都会有Driver个数的显示&#xff0c;如下图所示。本文主要介绍Presto中是如何决定Driver的个数的。 二. Driver个数 在Presto中&#xff0c;一个pipeline中启动多少个Driver&#xff0c;是由此Pipeline处理的S…

新增收货地址【项目 商城】

新增收货地址【项目 商城】 新增收货地址1 新增收货地址-数据表创建2 新增收货地址-创建实体类3 新增收货地址-持久层3.1 各功能的开发顺序3.2 规划需要执行的SQL语句3.3 接口与抽象方法3.4 配置SQL映射 测试4 新增收货地址-业务层4.1 规划异常4.2 接口与抽象方法 测试5 新增收…

epoll() 多路复用 和 两种工作模式

1.epoll API 介绍 typedef union epoll_data {void *ptr;int fd;uint32_t u32;uint64_t u64; } epoll_data_t;struct epoll_event {uint32_t events; /* Epoll events */epoll_data_t data; /* User data variable */ };常见的Epoll检测事件&#xff1a;- EPOLLIN- EPOLLOUT- …

农村农产品信息展示网站的设计与实现(论文+源码)_kaic

摘 要 随着软件技术的迅速发展,农产品信息展示的平台越来越多,传统的农产品显示方法将被计算机图形技术取代。这种网站技术主要把农产品的描述、农产品价格、农产品图片等内容&#xff0c;通过计算机网络的开发技术&#xff0c;在互联网上进行展示&#xff0c;然后通过计算机网…

如何识别计算机病毒,怎样识别计算机病毒

电脑病毒不仅影响电脑的正常使用&#xff0c;有时候还会威胁到我们的个人信息包括财务信息的安全。下面就让学习啦小编教大家怎样识别计算机病毒吧。 识别计算机病毒的方法 病毒一般通过自我隐藏的方式来达到自己的目的&#xff0c;那么病毒一般都隐藏在系统的什么地方呢?一般…

计算机病毒为了隐藏,识别计算机病毒的方法

识别计算机病毒的方法 病毒为了能随系统启动而自启动对电脑进行危害操作&#xff0c;通常会把自己设置为自动启动。更有甚者&#xff0c;它们还会将自己注册成系统服务&#xff0c;优先于其他程序启动。下面是小编收集整理的识别计算机病毒的方法&#xff0c;欢迎阅读。 识别计…

可以查杀计算机病毒的软件,怎样彻底查杀计算机病毒

电脑中毒后很可能后导致电脑出现无法开机,卡死等各种的情况&#xff0c;那么怎样彻底查杀计算机病毒呢?学习啦小编分享了彻底查杀计算机病毒的方法&#xff0c;希望对大家有所帮助。 彻底查杀计算机病毒方法一 打开腾讯电脑管家&#xff0c;并找到杀毒页面 选择【闪电查杀】等…

检查和清除计算机病毒可以使用,如何深入检查和杀死计算机病毒

当我们的计算机感染病毒时&#xff01;如果我们想深入查杀&#xff0c;该怎么办&#xff1f;以下是学习编辑器深入检查和杀死计算机病毒的方法的详细介绍&#xff01;希望对您有帮助&#xff01; 一种深度检测计算机病毒的方法: 垃圾清除软件建议安装金山卫士&#xff0c;它可以…

2. 两数相加(中等系列)

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

如何根据公司名称来筛选快递

在查询快递物流的时候&#xff0c;如果想要对快递公司名称一致的单号进行筛选&#xff0c;该怎么办呢&#xff1f;不知道如何操作的宝贝们&#xff0c;下面请随小编一起来试试。 需要哪些工具&#xff1f; 快递批量查询高手 快递单号若干 怎么快速查询&#xff1f; 首先&…

关于名字

为什么80%的码农都做不了架构师&#xff1f;>>> 书不尽言&#xff0c;言不尽意。言者所以在意&#xff0c;得意而忘言。先从程序里的变量名说起。作为程序员&#xff0c;我们知道&#xff0c;大部分时候&#xff0c;我们要求程序中的变量名是唯一的。比如数据库里的…

2023-2029全球与中国电子级丙二醇甲醚醋酸酯市场现状及未来发展趋

电子级丙二醇甲醚醋酸酯的定义 丙二醇甲醚醋酸酯(PMA)&#xff0c;也称丙二醇单甲醚乙酸酯&#xff0c;是一种无色、有特殊气味的高级溶剂。PMA分子中既有醚键&#xff0c;又有羰基&#xff0c;羰基又形成了酯的结构&#xff0c;同时又有烷基&#xff1b;PMA同一分子中极性与非…

2022-2028年中国低温固化粉末涂料行业市场发展调研及未来前景规划报告

报告类型:产业研究 报告格式:电子版、纸介版、电子+纸介 出品单位:智研咨询-产业信息网 智研咨询发布的《2022-2028年中国低温固化粉末涂料行业市场发展调研及未来前景规划报告》共十四章。首先介绍了低温固化粉末涂料行业市场发展环境、低温固化粉末涂料整体运行态势等,…

2022-2028年中国化工催化剂行业市场全景评估及发展趋势研究报告

报告类型&#xff1a;产业研究 报告格式&#xff1a;电子版、纸介版、电子纸介 出品单位&#xff1a;智研咨询-产业信息网 智研咨询发布的《2022-2028年中国化工催化剂行业市场全景评估及发展趋势研究报告》共十四章。首先介绍了化工催化剂行业市场发展环境、化工催化剂整体运…

2022年全球市场环氧活性稀释剂总体规模、主要生产商、主要地区、产品和应用细分研究报告

本文研究全球市场、主要地区和主要国家环氧活性稀释剂的销量、销售收入等&#xff0c;同时也重点分析全球范围内主要厂商&#xff08;品牌&#xff09;竞争态势&#xff0c;环氧活性稀释剂销量、价格、收入和市场份额等。 针对过去五年&#xff08;2017-2021&#xff09;年的历…

2021年全球强化采油表面活性剂收入大约202.3百万美元,预计2028年达到297.1百万美元

本文研究全球市场、主要地区和主要国家强化采油表面活性剂的销量、销售收入等&#xff0c;同时也重点分析全球范围内主要厂商&#xff08;品牌&#xff09;竞争态势&#xff0c;强化采油表面活性剂销量、价格、收入和市场份额等。 针对过去五年&#xff08;2017-2021&#xff0…

Modbus转Profinet网关连接三菱变频器博图快速配置

本案例将分享如何使用兴达易控的modbus转profinet网关&#xff08;XD-MDPN100&#xff09;来连接西门子1200系列plc&#xff0c;并实现三菱变频器的485通讯兼容转modbusTCP通信。通过在博图中进行配置&#xff0c;我们可以实现设备之间的连接和通信。 首先&#xff0c;我们需要…

[好书推荐] 之 <趣化计算机底层技术>

趣化计算机底层技术 底层技术优势购买 底层技术 相信很多老铁跟我一样, 在深入了解底层技术的时候 — — 就很头大 很多书籍看上去跟一个 老学究 一样, 说的话不是我们这些小白看的懂得… 看不懂就会 打击我们的自信心我们就有可能找一堆理由去玩(理所应当地去玩的那一种, 反…

基于flowplayer的视频缩略图的视频预览

前言 不得不吐槽一下咯&#xff0c;年终奖发了不到半个月的工资&#xff0c;心醉了&#xff0c;心凉了&#xff01;不过技术知识是属于自己的东西&#xff0c;有新的想法&#xff0c;学到新的知识还是的总结出来&#xff0c;和大家分享分享&#xff01; 最近一直在忙公司的项…