随笔分类 -  代码优化

摘要:本文主要从实用主义的角度,表达了作者对当前图像去噪算法的一些见解。 图像去噪,是图像处理中的一个经典课题。尽管有很多有效的算法被提出,但能真正可实际使用的算法却还没有,至少从公开发表的文章来看是如此。也许是本文作者坐井观天,才疏浅薄,欢迎大家拍砖。如果您有好的算法,欢迎和本文作者一道讨论,共同进步。1. 从高斯滤波到双边滤波 高斯滤波是经典的图像滤波的算法,能够在一定程度上抑制噪声。很多算法都拿高斯滤波做预处理,例如canny边缘检测算子。然而高斯滤波在模糊图像的同时,也模糊了图像的边缘信息。于是,衍生出大量的边缘保持滤波算法。这主要有两类:基于PDE的非线性们扩散和双边滤... 阅读全文
posted @ 2013-12-29 15:50 celerychen 阅读(3335) 评论(1) 推荐(2)
摘要:const int N = 33 * 1024;const int threadsPerBlock = 256;const int blocksPerGrid = imin( 32, (N+threadsPerBlock-1) / threadsPerBlock );__global__ void dot( float *a, float *b, float *c ) { __shared__ float cache[threadsPerBlock]; int tid = threadIdx.x + blockIdx.x * blockDim.x; in... 阅读全文
posted @ 2013-09-07 14:55 celerychen 阅读(464) 评论(0) 推荐(0)
摘要:SSE2与SSE1使用相同寄存器,指令描述约定:MM指64位MMX寄存器XMM指128XMM寄存器m32 指32位内存变量m128指128位内存变量本小结主要描述双精度浮点运算指令1. 数据搬移指令 movapdXMM,XMM/m128 movapdXMM/m128,XMM 把源存储器内容值送入目的寄存器,当有m128时,内存变量地址必须16字节对齐. movupdXMM,XMM/m128 movupdXMM/m128,XMM 把源存储器内容值送入目的寄存器,内存变量地址不必对齐16字节. 两条指令同SSE1的浮点搬移指令movaps 和 movups 指... 阅读全文
posted @ 2013-05-16 14:26 celerychen 阅读(2542) 评论(0) 推荐(0)
摘要:本小节描述的是SSE2整数运算指令。5. 数据搬移指令 movdqa XMM,XMM/m128 movdqa XMM/m128,XMM 把源存储器内容值送入目的寄存器,当有m128时,内存地址必须16字节对齐. movdqu XMM,XMM/m128 movdqu XMM/m128,XMM 把源存储器内容值送入目的寄存器,内存地址不必16字节对齐. movq2dq XMM,MM 把源寄存器内容送入目的寄存器的低64位,高64位清零. movdq2q MM,XMM 把源寄存器低64位内容送入目的寄存器.6. 算数运算指令 要点: 1. SSE2的算数运算指... 阅读全文
posted @ 2013-04-23 12:22 celerychen 阅读(1512) 评论(0) 推荐(0)
摘要:这里简要描述几个重要的算数运算指令。1. 水平相加指令 SSSE3指令集增加的主要是针对整数进行水平方向上相加的指令,与SSE3的浮点指令类似。 phaddd 寄存器水平方向上按照无符号32位整数进行加法 phaddw 寄存器水平方向上按照无符号16位整数进行加法 phaddsw 寄存器水平方向上按照16位整数进行饱和加法 phsubd 寄存器水平方向上按照无符号32位整数进行减法 phsubw 寄存器水平方向上按照无符号16位整数进行减法 phsubsw 寄存器水平方向上按照16位整数进行饱和减法 示例: phaddw Dest, SRC 源数据和目的数据水平相... 阅读全文
posted @ 2013-04-23 12:22 celerychen 阅读(940) 评论(0) 推荐(0)
摘要:实际上,搞汇编优化的很多时间是在处理如何有效的组织数据,以适应并行计算指令的数据结构。本小结描述的是数据混洗指令,这类指令使用起来相当的灵活。具体如下: 1. shufps XMM,XMM/m128,imm8(0~255) 描述: 从指令后缀来看,这是一条SSE1指令。 该指令把源存储器与目的寄存器按双字32位划分,由立即数imm8八个二进制位(00~11,00^11,00~11,00~11)指定排列, 目的寄存器高64位放源存储器被指定数,目的寄存器低64位放目的寄存器被指定数。内存变量地址必须对齐16字节 imm8的高4位选的是源存储器,低4位选的是目的... 阅读全文
posted @ 2013-04-23 12:22 celerychen 阅读(2278) 评论(0) 推荐(0)
摘要:本文要介绍的是SSE4.1指令集中的几条整数指令及其在视频编码中的应用。1.单指令32字节差分绝对值求和指令 MPSADBW 这条指令类似于SSE的PSADBW,但它实现的功能更强大。包括微软官方网站上对这条指令的说明都不是能够让人一目了然。下面这张图也许可以帮助我们理解: 这条指令的灵活之处在于源操作数和目的操作数的位置都是可选的。如何选择关键在于后面那个mask常量。这个常量是一个立即数,但只用到了其中的低三位。 其中,最低2位,用于选择源操作数的连续4个字节的起始位置。由于两位二进制有4中状态,所以源操作数的可选起始位置共有4种,具体见上图。 mask的第三位用于选择目的操... 阅读全文
posted @ 2013-04-23 12:22 celerychen 阅读(1440) 评论(0) 推荐(0)
摘要:6. SSE整数运算指令 pavgb MM,MM/m64 pavgb XMM,XMM/m128 把源存储器与目的寄存器按字节无符号整数相加,再除以2,结果四舍五入为整数放入目的寄存器。 源存储器为m128时,内存变量地址必须16字节对齐. pavgw MM,MM/m64 pavgw XMM,XMM/m128 把源存储器与目的寄存器按字无符号整数相加,再除以2,结果四舍五入为整数放入目的寄存器, 源存储器为m128时,内存变量必须对齐内存16字节. pextrw r32,MM,imm8 pextrw r32,XMM,imm8 从源寄存器中选第imm8(0~3 或 0~... 阅读全文
posted @ 2013-04-23 12:22 celerychen 阅读(837) 评论(0) 推荐(0)
摘要:本文要谈的是这样一条指令: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 += abs(current[y][x] - reference[y][x])对于这段代码,我们首先来用MMX指令做优化。1. SAD的MMX优化我们使用带饱和运算的PSUBUSB指令来实现求ABS (B - A)的功能。.. 阅读全文
posted @ 2013-04-23 12:22 celerychen 阅读(828) 评论(0) 推荐(0)
摘要:1. 数据加载存储指令 LDDQU xmm, m128 从非对齐的内存地址中加载128位数到XMM寄存器,此条指令比SSE2的非对齐加载指令MOVDQU 要快。 MOVDDUPxmm,xmm/m64 加载64bit数据到XMM寄存器的低64位,同时复制到其高64位。 MOVSHDUPxmm, xmm/m128 只需复制第二与第四个32位元素从而把数据读入到接收寄存器中 MOVSLDUPxmm, xmm/m128 只需复制第一和第三个32位元素从而把数据读入到接收寄存器中2. 算术指令 ADDSUBPD - (Add-Subtract-Packed-Double) 双精度浮点高位加法... 阅读全文
posted @ 2013-04-23 12:22 celerychen 阅读(323) 评论(0) 推荐(0)