编程语言
yutianzuijin
目前从事语音识别相关的工作。
展开
-
利用callgrind+gprof2dot+dot进行性能分析
在确保代码运行正确无误之后,我们往往都需要进行性能优化,不过受限于阿姆达尔定律,性能优化需要针对热点代码进行。热点代码可以通过分析算法复杂度获得,也可以通过运行性能分析工具获得。在此我们给大家介绍一组工具callgrind+gprof2dot+dot,可以非常方便地分析代码瓶颈。1.CallgrindValgrind是一款常用的代码分析工具,在大多数情况下我们都会用它来帮我们查找内存泄露和内存读写错误,但实际上,它的功能远不止如此。利用它的callgrind工具我们还可以对代码各部分的运行时间进行分析。原创 2020-11-16 22:13:27 · 2361 阅读 · 3 评论 -
CMake入门
在之前的工作中经常用Makefile来编译项目,但是最近需要阅读别人的项目需要用到CMake,在此记录一下CMake的入门级知识。添加项目中所有的代码文件aux_source_directory命令会查找指定目录下的所有源文件,然后将结果存进指定变量名。#查找当前目录下的所有源文件#并将名称保存到 DIR_SRCS 变量aux_source_directory(. DIR_SRCS)#...原创 2020-02-16 19:07:15 · 1117 阅读 · 0 评论 -
类型强转和地址强转
1 例子 最近在干一个很复杂的事—读4w多行的项目源码,头都大了有木有!其中有一步是加载一个二进制文件,为了更好的理解代码的含义,我需要一点一点解析二进制文件。在解析到某个位置的时候,有个读浮点数的操作,对应的二进制值为:…CAF249F1…。非常好奇这个值对应的浮点数是多少,所以写代码去求解一下。这里我没有犯一个错误:原始的文件中是按照从低字节到高字节排序的,所以实际的数应该为:原创 2014-10-19 19:41:46 · 7152 阅读 · 4 评论 -
C语言获取文件大小
C语言是一种比较底层的语言,有时在其他语言中很容易操作的事情,在C语言中就比较麻烦,例如获取一个文件的大小。Java中File类有个length函数,Python中os.path包中有个getsize函数,C语言中却没有直接对应的函数获取文件大小。 目前,网上有一种流传很广的方法,读取文件到内存,然后跳转到文件末尾,查看跳转的长度。代码如下:int file_size(char原创 2014-05-27 15:09:07 · 103129 阅读 · 7 评论 -
关于CUDA中__threadfence的理解
__threadfence函数是memory fence函数,用来保证线程间数据通信的可靠性。与同步函数不同,memory fence不能保证所有线程运行到同一位置,只保证执行memory fence函数的线程生产的数据能够安全地被其他线程消费。(1)__threadfence:一个线程调用__threadfence后,该线程在该语句前对全局存储器或共享存储器的访问已经全部完成,执行结果对原创 2013-01-15 21:20:04 · 15361 阅读 · 7 评论 -
NDK编程的一个坑—Arm平台下的类型转换
最近在做DNN定点化相关的工作,DNN定点化就是把float表示的模型压缩成char表示,虽然会损失精度,但是由于DNN训练的模型值比较接近且范围较小,实际上带来的性能损失非常小。DNN定点化的好处是可以以4倍的效率压缩模型,这个在移动端会具有比较大的优势。 做完定点化之后,在x86服务器上验证没有问题,但是利用NDK移植到arm移动端却一直得不到正确结果,真是一时头大。通过仔细调试,最终原创 2017-01-15 15:14:02 · 2344 阅读 · 1 评论 -
Linux下的有用命令
在之前的博客《Linux下常用命令与使用技巧》中,介绍了Linux的常用命令,在今天的博客中,给大家介绍其他的有用命令。1.文本转换命令在Linux下工作,我们不可避免地要和文件格式做斗争,相信大家也深刻地体会过格式的复杂性。今天给大家介绍几个在实际中经常用到的和格式相关的命令。export命令在linux命令行中输入汉字的时候有时候会显示乱码,这时我们就需要设置一下系统的编码方式。可以先用loca原创 2016-12-10 18:21:57 · 2631 阅读 · 0 评论 -
利用FFmpeg将pcm文件转成wav文件
现在需要利用cool edit对一批pcm音频文件进行分析。由于没有相关信息指定音频的采样率,信道数和精度,所以cool edit在打开一个pcm的时候需要让我们指定相关参数。当需要分析的pcm非常多时,每次都需要指定相关参数就显得非常麻烦。我们可以给pcm文件添加一个wav文件头来指定相关参数,从而无需每次打开进行设置。 给原始的pcm数据添加wav头不是什么麻烦事,我们完全可以写一个c原创 2017-03-12 14:24:44 · 13590 阅读 · 0 评论 -
Linux下统计文档中每个字符出现的次数
给定一个中文文档,我们想统计其中每个字出现的次数该怎么做呢?如果是英文文档,这个问题有比较固定的思路:用tr命令或者awk命令按照每行的空格将单词切分到多行,然后sort命令排序所有的行,最后uniq命令统计重复行的次数即可获得每个单词出现的次数。但是换成中文文档之后,tr或者awk命令就无法再根据空格将一行汉字切分到多行,需要我们更换其他命令。 一种可行的方法是借用cut命令。cut命令原创 2017-03-24 10:42:02 · 9355 阅读 · 1 评论 -
cuda half编程的各种坑
自cuda7.5开始我们可以直接用half(fp16)编程,理论上速度会比float快一倍左右。理想虽好,现实却比较骨感,在实际中会遇到各种坑,最终的结果却是不一定有收益,下面把自己在用half编程中踩过的坑记录一下。1. half编程和计算能力密切相关half编程要求GPU的计算能力要大于等于5.3,这就意味着大家很多GPU不支持此功能。例如,GTX 1050之前的GPU全不支持half计算...原创 2019-05-24 18:24:24 · 9405 阅读 · 1 评论 -
k均值图像分割的GPU加速
图像分割是指把图像分成各具特性的区域并提取出感兴趣目标的技术和过程,是从图像处理到图像分析的关键步骤。K均值聚类算法是目前最受欢迎和应用最为广泛的聚类分析方法之一。K均值聚类算法用于图像分割具有直观、快速、易于实现的特点。不过当图像很大或者k很大时,采用k均值算法进行图像分割会异常缓慢,所以我们需要对其进行加速。幸运的是,k均值算法最核心的步骤具有很高的并行性,这给我们加速带来了很大遍历。我们既可...原创 2019-06-04 17:08:45 · 2347 阅读 · 2 评论 -
《Tips for Optimizing C/C++ Code》译文
前不久在微博上看到一篇很好的短文讲如何对C/C++进行性能优化,虽然其面向的领域是图形学中的光线跟踪,但是还是具有普遍的意义,将其翻译成中文,希望对大家写高质量代码有帮助。1. 牢记阿姆达尔定律:加速比==其中表示函数func运行时间占总时间的百分比,表示对该函数加速获得的加速比。例如,你优化一个函数TriangleIntersect(),该函数的运行时间占总时间的翻译 2014-05-19 23:05:07 · 3747 阅读 · 1 评论 -
vim常用操作
vim是Linux下编程的利器,用好vim,它的功能可以强大到比肩IDE。根据自己的使用情况,下面列出了比较好用的一些vim命令:操作模式作用/word命令查找wordn命令找到要查找的内容后,往下依次遍历N命令反向遍历要查找的内容ctrl+]命令查找一个函数或变量的最初定义位置原创 2012-10-18 15:46:25 · 1775 阅读 · 0 评论 -
Linux下常用命令与使用技巧
1. head命令head命令用来显示文件开头的几行。其还有一个很好的用途是用来合并文件,与cat然后重定向相比它会在合并的文件中每个文件开始包含合并文件的文件名。例:head -99999 ReadMe* >/tmp/merge_ReadMe.txt。含义是:将当前目录下以ReadMe开头的多个文件显示前99999行(其实就是显示整个文件),并重定向到tmp目录下的merge_ReadMe.原创 2012-10-13 22:31:35 · 1724 阅读 · 0 评论 -
Matlab类与链表
最初知道matlab可以创建链表是通过阅读博客:在matlab中实现链表知道的。然后通过仔细阅读matlab帮助文档,终于自己搞明白如何利用matlab创建链表。首先介绍matlab中的类。1 matlab中的class 起初认为matlab是面向过程式的语言,通过编写一系列函数或者脚本完成任务,但其实matlab中也可以通过创建类的方式实现面向对象编程。其实自己早就应该发现,在原创 2020-02-27 10:02:31 · 20245 阅读 · 1 评论 -
嵌入式汇编
本文叙述了自己在windows环境和Linux环境下写嵌入式汇编的一些经验,希望对大家有所帮助。原创 2010-08-24 11:18:00 · 4081 阅读 · 1 评论 -
Linux下读取位图的注意事项
在Linux下读取位图遇到的问题,很好地体现了Linux与Windows操作系统的不同。按理说位图格式与操作系统无关,读取也应该无关,实际上在位图读到内存中时已经不同。下面主要介绍自己在Linux下操作位图遇到的问题。(一)、位图结构 位图一开始是两个结构体,包括位图的详细信息,是读取后面数据的关键。所以读取位图首先要正确读取这两个结构体:BITMAPFILEHEADER和BITMA原创 2012-11-30 15:09:33 · 3933 阅读 · 0 评论 -
cuda中模板的使用
模板是C++的一个重要特征,它可以让我们简化代码,同时使代码更整洁。CUDA中也支持模板,这给我们编写cuda程序带来了方便。不过cuda4.0之前和之后使用模板的方法不一样,这给我们带来了少许困难。在cuda4.0之前,模板的使用和C++中无区别,使用非常方便,在此不做过多介绍。不过在cuda4.0之后,由于编译器的升级,导致之前的模板使用方法不再有效,我们需要重新设计代码。如果按照之前的方原创 2013-07-09 23:45:50 · 6748 阅读 · 0 评论 -
java程序的加载过程
昨天笔试阿里有个求java程序加载过程的题目很是复杂,回来研究了好久才有点明白,整理一下。原题代码如下,判断输出:public class StaticTest { public static int k=0; public static StaticTest s1=new StaticTest("s1"); public static StaticTest s2=new Stati原创 2013-09-23 15:58:12 · 8125 阅读 · 3 评论 -
java基础知识汇总
1. 类的访问控制权限共有两种:public和默认。默认级别的类只能被同一个包中的类看到,包外不可见。2. 类成员的访问权限共有四种:public,protected,private和默认。protected成员包内随便访问,包外继承才能访问。private类外不能访问,内部类可以访问。默认包内可以访问,包外不能访问。3. final修饰变量的基本含义是,该变量一旦原创 2013-08-02 21:53:55 · 2981 阅读 · 0 评论 -
CUDA编程常见问题
最近初试cuda编程,作为一个新手,遇到了各种各样的问题,然后花费了大量时间解决这些匪夷所思的问题。为了避免后来人重蹈覆辙,现把自己遇到的问题总结如下。(一)、cudaMalloc 初次使用该函数,感觉没有什么困难,和c语言的malloc类似。但是在具体应用中却出了一个很难找的错误,花费了很多时间。该函数使用是需要注意的就是,它分配的内存空间单位是字节,所以需要我们在使用时用siz原创 2012-11-05 10:55:07 · 19479 阅读 · 3 评论 -
C语言基础知识
1. 一个枚举数据类型的每个枚举常量都表示一个特定的值,如果不是隐式地由枚举值列表中位置所决定,就是显式地使用一个常量表达式来初始化。由位置决定时,初始值是0。枚举中不同的常量,可以有相同的值。2. 编译器隐式地将一个具有数组类型的表达式(不如数组名)转换成指向数组第一个元素的指针。只有在下面的情况下,数组表达式才不会被转换成指针:1)当数组是sizeof运算符的操作数原创 2013-08-03 23:33:41 · 2677 阅读 · 0 评论 -
linux知识汇总
1. 利用Ctrl+Alt+F1到Ctrl+Alt+F6在6个虚拟控制台之间切换,利用Ctrl+Alt+F7切换回图形界面。2. 使用who命令来判断谁在系统上及其登录方式。id命令用来显示用户信息和组信息。3. cal命令列出当前月的日历。4. ps命令用来列出在系统上运行的进程。没有参数的ps命令显示单个终端上其他的所有进程。ps aux命令显示所有原创 2013-08-04 22:39:19 · 1841 阅读 · 0 评论 -
Linux下使用JNI的常见问题及解决方案
JNI是java和C/C++混合编程的接口,可以很方便地实现java调用C/C++语言。具体的使用方法,网上有很多教程,在此不做过多介绍。本博客只关注在使用JNI的过程中的常见问题。1. 生成头文件用命令:javah*.class这是错误的。运行上述命令会提示:java.lang.IllegalArgumentException: Not a valid class name:Se原创 2013-07-26 22:29:24 · 14304 阅读 · 3 评论