exptern “C“的作用,在 C 和 CPP 中分别调用 openblas 中的 gemm 为例
openblas提供的sgemm有两种方式,一种是通过cblas,另一种是直接声明并调用 sgemm_
其中,cblas方式是更正规调用方法;
1,调用openblas的 sgemm 的两种方式
1.1 c语言程序中使用 sgemm
hello_sgemm.c
#include <stdlib.h>
#include <stdio.h>//#define CBLAS_USE 1 #ifdef CBLAS_USE
#include "cblas.h"
#else
//extern "C"{void sgemm_( char * const transpa, char * const transpb, int *m, int *n,int *k, float *alpha, float *a, int *lda, float *b, int *ldb,float *beta, float *c, int *ldc );
//}
#endifvoid init_matrix(int M, int N, float* A, int lda, int seed)
{srand(seed);for(int i=0; i<M; i++){for(int j=0; j<N; j++){A[i + j*lda] = (float)rand()/RAND_MAX;}}
}void print_matrix(int M, int N, float* A, int lda)
{for(int i=0; i<M; i++){for(int j=0; j<N; j++){printf(" %7.4f ", A[i + j*lda]);}printf("\n");}
}int main()
{int M = 3;int N = 3;int K = 3;float* A = NULL;float* B = NULL;float* C = NULL;int lda = M;int ldb = K;int ldc = M;A = (float*)malloc(lda*K* sizeof(float));B = (float*)malloc(ldb*N* sizeof(float));C = (float*)malloc(ldc*N* sizeof(float));init_matrix(M, K, A, lda, 2023); printf("\nA =\n"); print_matrix(M, K, A, lda);init_matrix(K, N, B, ldb, 2024); printf("\nB =\n"); print_matrix(K, N, B, ldb);init_matrix(M, N, C, ldc, 2025); printf("\nC =\n"); print_matrix(M, N, C, ldc);float alpha = 1.0f;float beta = 0.0f;
#ifdef CBLAS_USEcblas_sgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, M, N, K, 1.0, A, lda, B, ldb, 0.0, C, ldc);printf("C = alpha*A*B + beta*C =cblas_sgemm()=\n"); print_matrix(M, N, C, ldc);
#elsesgemm_("N", "N", &M, &N, &K, &alpha, A, &lda, B, &ldb, &beta, C, &ldc);printf("C = alpha*A*B + beta*C = sgemm_()=\n"); print_matrix(M, N, C, ldc);
#endifreturn 0;
}
运行效果:
$ gcc -DCBLAS_USE hello_sgemm.c -L ../tdd/third-party/openblas/local/lib/ -lopenblas -o hello_sgemm_c
$ gcc hello_sgemm.c -L ../tdd/third-party/openblas/local/lib/ -lopenblas -o hello_sgemm_c

可见调用 sgemm_() 与调用 cblas_sgemm() 的结果相同;
需要注意sgemm_()函数的声明方式,参数全部都是指针:
void sgemm_( char * const transpa, char * const transpb, int *m, int *n,
int *k, float *alpha, float *a, int *lda, float *b, int *ldb,
float *beta, float *c, int *ldc );
1.2 cpp 语言程序中调用 sgemm
相较于 c 语言中,cpp 程序中增加了 extern "C"{ 修饰;
否则编译无法通过,由于c++的特性。
hello_sgemm.cpp
#if CBLAS_USE
#include "cblas.h"
#else
extern "C"{void sgemm_( char * const transpa, char * const transpb, int *m, int *n,int *k, float *alpha, float *a, int *lda, float *b, int *ldb,float *beta, float *c, int *ldc );
}
#endif
2. cpp 中的sgemm_声明为何需要 extern "C"
extern "C" 的作用:
在 C++ 源代码文件中,使用 extern "C" 的作用是告诉编译器按照 C 语言的方式对函数进行链接,而不是 C++ 的方式。这在与其他语言或库进行交互时非常有用,特别是在 C++ 代码中调用 C 语言编写的函数时。
当您使用 extern "C" 修饰一个函数声明时,编译器会按照 C 语言的命名约定来生成函数符号,这样可以确保 C++ 代码和 C 代码之间的函数调用能够正确链接。在 C++ 中,函数名可能会经过名称修饰(name mangling)以支持函数重载和其他特性,比如在函数末尾加上参数类型缩写,而 C 语言没有这种面向对象的语法概念和需求。
如下图可见,
print_matrix函数的名字,在 cpp中被加了前缀和后缀,而 c语言文件中,函数名字依然为
print_matrix

相关文章:
exptern “C“的作用,在 C 和 CPP 中分别调用 openblas 中的 gemm 为例
openblas提供的sgemm有两种方式,一种是通过cblas,另一种是直接声明并调用 sgemm_ 其中,cblas方式是更正规调用方法; 1,调用openblas的 sgemm 的两种方式 1.1 c语言程序中使用 sgemm hello_sgemm.c #include <st…...
如何提前预防网络威胁
一、引言 随着信息技术的迅猛进步,网络安全议题愈发凸显,成为社会各界不可忽视的重大挑战。近年来,一系列网络安全事件的爆发,如同惊雷般震撼着个人、企业及国家的安全防线,揭示了信息安全保护的紧迫性与复杂性。每一…...
ProviderRpc发送服务二将远程调用来的信息反序列化后调用服务方的方法,并将服务方的结果返回给发送方
在Provider的实现中,OnMessage函数中,处理接收到的连接RPC请求。将接收到的RPC请求(包含请求的对象,请求方法和 请求参数),接收到这些信息之后进行反序列化。得到这些参数之后我们即将要做的事情是去调用相…...
Io 35
FIleinputStream字节输入 package File.io;import java.io.*;public class io1 {public static void main(String[] args) throws IOException {// InputStream is new FileInputStream(new File("C:\\Users\\SUI\\Desktop\\Java1\\one\\src\\kaishi"));//简化Input…...
java基础概念11-方法
一、什么是方法 方法(method)是程序中最小的执行单元。 方法中的程序,要不然就是一起执行,要不然就是一起不执行!!! 二、方法的定义 在Java中,方法定义的一般格式如下:…...
大模型应用中的思维树(Tree of Thought)是什么?
大模型应用中的思维树(Tree of Thought)是什么? 大模型,特别是基于GPT(Generative Pre-trained Transformer)架构的模型,在处理复杂任务时,通常需要依赖某种形式的推理和决策机制。…...
学习记录(11):训练图片分类的算法
文章目录 一、卷积神经网络(CNN)架构1. ResNet(Residual Networks)2. DenseNet(Densely Connected Convolutional Networks)3. EfficientNet4. MobileNet 二、变换器(Transformer)架…...
上网防泄密,这些雷区不要碰!九招教你如何防泄密
李明:“最近看到不少关于信息泄露的新闻,真是让人担忧。咱们在工作中,稍有不慎就可能触碰到泄密的雷区啊。” 王芳:“确实,网络安全无小事。尤其是我们这种经常需要处理敏感信息的岗位,更得小心谨慎。那你…...
数据库篇--八股文学习第十五天| 一条SQL查询语句是如何执行的?,事务的四大特性有哪些?,数据库的事务隔离级别有哪些?
1、一条SQL查询语句是如何执行的? 答: 连接器:连接器负责跟客户端建立连接、获取权限、维持和管理连接。查询缓存: MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以…...
elk + filebeat + kafka实验和RSync同步
elk filebeat kafka实验和RSync同步 elk filebeat kafka实验 filebeatkafkaELK实验的操作步骤: #在装有nginx的主机上解压filebeat压缩包 [roottest4 opt]# tar -xf filebeat-6.7.2-linux-x86_64.tar.gz #将解压后的压缩包更改名字 [roottest4 opt]# mv file…...
子类到底能继承父类中的哪些内容?
...
【超详细公式】曝光值(EV)、光圈(AV)、快门(TV)、感光度(SV)、照度(Lux)
文章目录 术语 E V A V T V − S V EV AV TV - SV EVAVTV−SV L u x 2.5 2 E V Lux 2.5 \times 2^{EV} Lux2.52EV通常环境光照度参照表 术语 术语全称中文名EVExposure Value曝光值AVAperture Value光圈值TVTime Value快门值SVSensitive Value感光值BVBrightness Value…...
【Java】增强for遍历集合。
增强for遍历 增强for底层就是迭代器。所有的单列集合和数组才能使用增强for遍历。 在循环过程中无法对集合中的元素进行修改。 package demo;import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;public class submit {public static void …...
【Qt】管理创建子项目
新建项目 打开是这样,无法添加子项目 pro添加 TEMPLATE subdirs有了 点击添加子项目 其他项目-子目录项目 (空的子项目,只有pro,无h、cpp) 子目录名字 直接创建子目录下子项目 选择有无界面或者其他类型项目 …...
力扣——238.移动零
题目 思路 利用双指针,先找到第一个为0的地方指向,指针2指向下一个,指针1之前是已经处理好的数据,指针2进行遍历,遇到非零则与指针1数据交换,然后指针1。 代码 class Solution { public:void moveZeroes(…...
编程的魅力
在数字化时代,编程已不仅仅是计算机科学家的专属领地,它正逐渐渗透到我们生活的每一个角落,成为连接现实与虚拟、创新与传统的重要桥梁。编程,这一门融合了逻辑、创造与解决问题的艺术,正以其独特的魅力引领着新一轮的…...
想提升跨境电商运营?浏览器多开为你助力!
在日常生活中,我们在使用浏览器访问网站时,可能会遇到一个尴尬的情况:无法同时登录一个网站的多个账号。对于跨境电商卖家来说,这种情况更为常见。例如,当我们需要在亚马逊管理店铺时,我们可能已经使用A账号…...
使用QML的ListView自制树形结构图TreeView
背景 感觉QML自带的TreeView不是很好用,用在文件路径树形结构比较多,但是想用在自己数据里,就不太方便了,所以自己做一个。 用‘ListView里迭代ListView’的方法,制作树形结构,成果图: 代码…...
2.MySQL面试题之索引
1. 为什么索引要用 B树来实现呢,而不是 B 树? MySQL 选择使用 B 树来实现索引,而不是 B 树,主要是基于以下几个原因: 1.1 数据存储和访问效率 B 树:在 B 树中,数据和索引都存储在每个节点中。…...
复制CodeIgniter新版的array_group_by辅助函数
很需要php数组的group_by功能,发现codeIgniter4.5新版中已有这个辅助函数,但我用的codeIgniter4.14没有,又不想升级php等一系列东西,就想把把codeIgniter4.5中array_group_by函数复制过来用。 先试着把新版本的array_helper文件及…...
服务依赖管理
服务依赖管理:构建稳定系统的关键基石 在现代分布式系统和微服务架构中,服务依赖管理已成为保障系统稳定性和可扩展性的核心环节。随着业务复杂度的提升,服务间的调用关系日益错综复杂,如何高效管理这些依赖关系,避免…...
前端动画:别让你的页面像块木头一样僵硬
前端动画:别让你的页面像块木头一样僵硬 什么是前端动画? 前端动画是指在前端页面中添加的动态效果,让页面更加生动有趣。别以为动画只是花里胡哨的东西,好的动画可以提升用户体验,让你的应用脱颖而出。 为什么需要动画…...
hot 100 73. 矩阵置零
矩阵置零问题描述样例输入样例输出评测用例规模与约定解析参考程序难度等级问题描述 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 样例输入 matrix [[1,1,1],[1,0,1],[1,1,1]]样例输出 [[1,0,…...
从零搞懂Transformer,从位置编码到自注意力,大模型的核心逻辑全拆解
平时我们用ChatGPT聊天、用翻译软件做中英互译、用AI写文案,甚至让AI帮忙编代码,背后最核心的“功臣”,都是2017年Google团队提出的Transformer模型。这个看起来复杂的模型,其实打破了传统AI的局限,靠着高效的计算能力…...
cv_resnet101_face-detection_cvpr22papermogface环境部署教程:ModelScope Pipeline集成详解
cv_resnet101_face-detection_cvpr22papermogface环境部署教程:ModelScope Pipeline集成详解 1. 引言 你有没有遇到过这样的场景?手头有一堆照片,需要快速找出里面有多少人,每个人脸在什么位置。传统方法要么不准,要…...
如何利用ShopXO用户行为数据分析工具提升电商转化率:5大核心功能实战指南
如何利用ShopXO用户行为数据分析工具提升电商转化率:5大核心功能实战指南 【免费下载链接】ShopXO开源商城 🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信支付宝百度头条&抖…...
如何用IronyModManager高效解决Paradox游戏模组冲突的3个关键策略
如何用IronyModManager高效解决Paradox游戏模组冲突的3个关键策略 【免费下载链接】IronyModManager Mod Manager for Paradox Games. Official Discord: https://discord.gg/t9JmY8KFrV 项目地址: https://gitcode.com/gh_mirrors/ir/IronyModManager Paradox Interact…...
YOLO X Layout小白指南:无需代码通过Web界面使用AI模型
YOLO X Layout小白指南:无需代码通过Web界面使用AI模型 1. 为什么选择YOLO X Layout 在日常办公和学习中,我们经常需要处理各种文档——可能是扫描的合同、PDF报告或是手机拍摄的讲义照片。传统方式下,要提取文档中的表格、标题或图片等内容…...
BGE Reranker-v2-m3开源可部署:完整源码+Dockerfile+Gradio UI,支持国产化改造
BGE Reranker-v2-m3开源可部署:完整源码DockerfileGradio UI,支持国产化改造 1. 项目简介与核心价值 你是否遇到过这样的问题?在开发一个智能客服系统,或者搭建一个内部知识库时,从海量文档里检索出来的结果…...
LS-PrePost后处理技巧:如何让你的小球打靶仿真结果更直观
LS-PrePost后处理高阶技巧:让小球打靶仿真结果跃然屏上 仿真工程师们常说:"前处理是体力活,后处理才是艺术。"这句话在小球打靶这类显式动力学仿真中尤为贴切。当你在LS-DYNA中完成了复杂的计算后,如何通过LS-PrePost将…...
