代码优化
文章平均质量分 88
celerychen2009
数学爱好者,人工智能爱好者
展开
-
MMX指令集系列之三----数据饱和压缩与重排指令
6. 数据压缩指令 packuswb MM,MM/m64 把目的寄存器按字有符号数压缩为饱和字节无符号数放入目的寄存器低32位, 把源寄存器字有符号数压缩为饱和字节无符号数放入目的寄存器高32位。 简单的说,就是16位有符号压缩为饱和8位无符号数。 高32位 | 低32位 目的寄存器:原创 2013-04-23 12:22:32 · 1384 阅读 · 0 评论 -
MMX指令集系列之二----移位运算和乘法指令
4. 数据移位指令 4.1 16位并行左移指令 psllw MM,MM/m64 psllw MM,imm8 把目的寄存器按字由源存储器(或imm8 立即数)指定位数逻辑左移,移出的位丢失. 低字移出的位不会移入高字. 例: 当MM0 = 0xffff ffff ffff ffff, 执行psllw MM0,1 则MM0 = 0xff原创 2013-04-23 12:22:29 · 1968 阅读 · 0 评论 -
SSE特殊指令集系列之一----各种数据重排指令
实际上,搞汇编优化的很多时间是在处理如何有效的组织数据,以适应并行计算指令的数据结构。本小结描述的是数据混洗指令,这类指令使用起来相当的灵活。具体如下: 1. shufps XMM,XMM/m128,imm8(0~255) 描述: 从指令后缀来看,这是一条SSE1指令。 该指令把源存储器与目的寄存器按双字32位划原创 2013-04-23 12:22:43 · 1825 阅读 · 0 评论 -
SSE4.1指令集系列之一----多字节绝对差值求和指令、水平最小值,整数格式扩展指令
本文要介绍的是SSE4.1指令集中的几条整数指令及其在视频编码中的应用。1. 单指令32字节差分绝对值求和指令 MPSADBW 这条指令类似于SSE的PSADBW,但它实现的功能更强大。包括微软官方网站上对这条指令的说明都不是能够让人一目了然。下面这张图也许可以帮助我们理解: 这条指令的灵活之处在于源操作数和目的操作数的位置都是可选的。如何选择关键在于原创 2013-04-23 12:22:52 · 1640 阅读 · 0 评论 -
CUDA编程札记
1. 关于线程号的计算方式 1.1 使用N个线程块,每一个线程块只有1个线程此时线程号的计算方式如下: Tid = blockIdx.x 其中,Tid的取值范围为0到N-1。对于此种情况,可以看做一个列向量,列向量中的每一行对应一个线程块。列向量中的每一行只有1个元素,对应于一个线程。1.2 使用MxN个线程块,每一个线程块只有1个线程由于线程块是原创 2013-09-07 14:55:51 · 2379 阅读 · 1 评论 -
SSSE3指令集----水平加法指令饱和字节乘加指令以及字节重排指令
这里简要描述几个重要的算数运算指令。1. 水平相加指令 SSSE3指令集增加的主要是针对整数进行水平方向上相加的指令,与SSE3的浮点指令类似。 phaddd 寄存器水平方向上按照无符号32位整数进行加法 phaddw 寄存器水平方向上按照无符号16位整数进行加法 phaddsw 寄存器水平方向上按照16位整数进行饱和加法原创 2013-04-23 12:22:47 · 2831 阅读 · 0 评论 -
对图像去噪的拙见
本文主要从实用主义的角度,描述了作者对当前图像去噪算法一些见解。原创 2013-12-29 15:50:30 · 12763 阅读 · 10 评论 -
矩阵LU分解分块算法实现
本文主要描述实现LU分解算法过程中遇到的问题及解决方案,并给出了全部源代码。1. 什么是LU分解? 矩阵的LU分解源于线性方程组的高斯消元过程。对于一个含有N个变量的N个线性方程组,总可以用高斯消去法,把左边的系数矩阵分解为一个单位下三角矩阵和一个上三角矩阵相乘的形式。这样,求解这个线性方程组就转化为求解两个三角矩阵的方程组。具体的算法细节这里不做过多的描述,有很多的教材和资源原创 2014-08-06 18:37:30 · 9107 阅读 · 0 评论 -
MATLAB conv2卷积的实现
MATLAB conv2卷积的实现原创 2014-08-26 19:13:36 · 22611 阅读 · 0 评论 -
C语言实现通用数据结构的高效设计
以简单的插入排序为例,说明如何在C语言中实现对任意数据类型的支持,同时模拟C++的模板,在代码大小和运行效率上取得平衡。原创 2014-10-31 16:14:36 · 2522 阅读 · 0 评论 -
SSE指令集系列之三----整数运算指令
6. SSE整数运算指令 pavgb MM,MM/m64 pavgb XMM,XMM/m128 把源存储器与目的寄存器按字节无符号整数相加,再除以2,结果四舍五入为整数放入目的寄存器。 源存储器为m128时,内存变量地址必须16字节对齐. pavgw MM,MM/m64 pavgw XMM,XMM/m128 把源存储器与目的寄存器按字无符原创 2013-04-23 12:22:39 · 2190 阅读 · 0 评论 -
函数可变参数
程序debug过程中经常会打印调试信息,如果我们要在程序运行过程当中看到调试信心,就得把运行的状态信息输出到文件。于是,我写了下面两个函数来实现可变参数的打印调试信息到文件。 #include "stdio.h"#include "stdarg.h" int print_string_to_file(char file_name[64], ...){ va_list a原创 2011-06-30 13:33:00 · 766 阅读 · 0 评论 -
一种高精度低复杂度的非线性函数定点计算方法
摘要 在嵌入式系统中,由于没有浮点运算单元,当涉及浮点运算的时候需要做定点化处理。查表法是一种常用的方法。表的大小直接关系到计算的精度和复杂度。如何在计算精度和复杂度之间取得平衡,是一个重要的问题。本文根据泰勒公式重新设计了一种新的计算方法。这种方法具有很高的精度,而计算复杂度低,表的大小也很小。 引言在多媒体数字信号处理中,经常要涉及一些非线性函数的计算。例如求开方,非整数幂次运算,原创 2013-04-23 12:22:09 · 2872 阅读 · 0 评论 -
SSE3指令集系列----数据加载与算术运算指令
1. 数据加载存储指令 LDDQU xmm, m128 从非对齐的内存地址中加载128位数到XMM寄存器,此条指令比SSE2的非对齐加载指令MOVDQU 要快。 MOVDDUP xmm, xmm/m64 加载64bit数据到XMM寄存器的低64位,同时复制到其高64位。 MOVSHDUPxmm, xmm/m128 只需复制原创 2013-04-23 12:22:45 · 1274 阅读 · 0 评论 -
SSE特殊指令集系列之二----字节绝对差值求和指令
本文要谈的是这样一条指令:PSADBW这条指令是SSE1引入的用于视频编码绝对差值求和的指令。在视频编码中的运动估计模块,一种常见的SAD代码如下:1 // Get the SAD 16x16 macro block with full pixel2 for (y = 0; y 16; y++)3 for(x = 0; x 16; x++)4 sad +=原创 2013-04-23 12:22:50 · 1697 阅读 · 0 评论 -
SSE指令集系列之二----浮点与整数转换指令
4. 数据重排指令集 unpckhps XMM,XMM/m128 源存储器与目的寄存器高64位按双字交错排列,结果送入目的寄存器,内存变量必须对齐内存16字节. 高64位 | 低64位 目的寄存器: a0 | a1 | a2 | a3 源存储器: b0 | b1 | b2 | b3 目的寄存器结果: b0 | a0原创 2013-04-23 12:22:36 · 1298 阅读 · 0 评论 -
SSE指令集系列之一----数据加载与浮点运算指令
SSE有8个128位独立寄存器(XMM1~XMM7),指令描述约定: MM指64位MMX寄存器 XMM指128XMM寄存器 m32 指32位内存变量 m128指128位内存变量 1. 数据传送指令 movapsXMM,XMM/m128 movaps XMM/m128,XMM 把源存储器内容值送入目的寄存器,当有m128时原创 2013-04-23 12:22:34 · 4035 阅读 · 0 评论 -
MMX指令集系列之一----数据加载与算术运算指令
MMX指令有8个64位寄存器(MM0~MM7),不过可惜都是借的FPU的, FPU原来有8个80位寄存器(st(0)~st(7)),现在用在了MMX上,所以用之后要加上一条EMMS指令,用以复位.MMX寄存器有64位,可以同时进行8对字节或4对字或2对双字同时相同操作,还可以进行饱和运算,不会溢出,当然也可以进行普通运算.特别要注意的一点是:在x86上,一个字,WORD的长度是16位,而在原创 2013-04-23 12:22:25 · 1276 阅读 · 0 评论 -
AMR中的RO,RW和ZI
要了解RO,RW和ZI需要首先了解以下知识:ARM程序的组成此处所说的“ARM程序”是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清注意区别。一个ARM程序包含3部分:RO,RW和ZIRO是程序中的指令和常量RW是程序中的已初始化变量ZI是程序中的未初始化的变量由以上3点说明可以理解为:RO就是readonly,RW就转载 2009-11-03 12:51:00 · 1072 阅读 · 1 评论 -
SSE2指令集系列之一----浮点运算指令
SSE2与SSE1使用相同寄存器,指令描述约定: MM指64位MMX寄存器XMM指128XMM寄存器m32 指32位内存变量m128指128位内存变量本小结主要描述双精度浮点运算指令1. 数据搬移指令 movapd XMM,XMM/m128 movapd XMM/m128,原创 2013-05-16 14:26:09 · 5419 阅读 · 0 评论 -
SSE2指令集系列之二----整数运算相关指令
本小节描述的是SSE2整数运算指令。5. 数据搬移指令 movdqa XMM,XMM/m128 movdqa XMM/m128,XMM 把源存储器内容值送入目的寄存器,当有m128时,内存地址必须16字节对齐. movdqu XMM,XMM/m128 movdqu XMM/m128,XMM 把源存储器内容值送入目的寄存器,内存地址原创 2013-04-23 12:22:41 · 1454 阅读 · 0 评论 -
ARM参数传递规则
1. r0,r1,r2,r3,在调用函数时,用来存放前4个函数参数和返回值,r4-r11,r14,在调用函数时必须保存这些寄存器到堆栈当中。如果函数的参数多于4个,则多余参数存放在堆栈当中,即sp,sp+4,sp+8,…依次类推。 2. 函数内部通用的入栈出栈代码可以为:STMFD sp!,{r4-r11,lr}// body of ASM code原创 2009-11-03 12:43:00 · 7714 阅读 · 5 评论 -
曲率滤波的简单实现只有源码
/** 打算自己实现一个更快更好的曲率滤波的算法将其开源, 但发现按照作者的博士论文的算法出来的效果,达不到作者文献中的效果。 而看作者公开的代码,发现和作者论文的算法又差距较大。 应该是鄙人对作者算法理解的问题,这里是我实现的一些代码,并不能直接运行,但不影响阅读。 我的实现方式和作者的实现方式完全不同,之所以采用这种方式,是因为还可以采用更多的指令集的 优化再次基础上加原创 2016-12-04 15:57:27 · 3046 阅读 · 2 评论