随笔分类 - 多媒体指令集
摘要:均值模糊原理很容易了,就不解释了。我测了一下,使用汇编的代码处理时间为1-2ms左右。cpp代码处理时间为3-4ms左右。这里只给出关键代码,其余代码见这里。void asmMeanFilter(BitmapData *data){ UINT Height=data->Height; UINT s_Height=Height-1; UINT Width=data->Width; UINT s_Width=Width-1; Pix* p=(Pix*)data->Scan0; UINT h,w,i,j; __asm { push ...
阅读全文
摘要:本来自己写了一个,不过性能竟然和memcpy一样,一点提升都没有,所以有就去网上找了一个性能好的。下面的程序是对100MB数据进行内存拷贝.我测试了一下。直接调用memcpy时间为100ms左右,而asm中的程序能把时间能缩短到80ms左右。性能提高的还是很明显的。#include <iostream>#include <ctime>#define N 100*1024*256using namespace std;int main(int argc, char* argv[]){ float *a; float *b; a=(float*)malloc(N*sizeo
阅读全文
摘要:如果不是处理的灰度图像,那么最大值也就没什么意思了。彩色图也可以转成灰度图嘛。虽然用了汇编,不过没有使用多媒体指令。灰度图像的RGB都一样,没必要使用mmx寄存器了,直接对单个字节处理就行了。获得最小值和获得最大值原理一样,只需改一个指令,把ja改为jna就行了。Pix asmGetMaxGrayPix(BitmapData *data){ //处理的是灰度图像,所以RGB值都一样 //这里不需要用mmx指令也可以 UINT Height=data->Height; UINT Width=data->Width; Pix* p=(Pix*)data->Scan0;...
阅读全文
摘要:权当练手了,效果不好,cpu没有提供pmulluw这样一个无符号字相乘指令。处理的效果和matlab明显不同,尤其是背景,我实在找不出问题在哪里,最可能就在寄存器符号上。灰度公式是:Gray = (R*76 + G*150 + B*30) >> 8有符号范围是[-32768-32767],无符号范围是[0-65536],前者显然不够存放255*150=38250的,所以就溢出了。提高了位宽模拟无符号相乘不行,减小运算精度也不行,开源节流都不行,让人很纠结。反正是初学,这指令还要多练才行。VOID asmARGB2Gray(BitmapData *data){ UINT Height
阅读全文
摘要:主要用来学习多媒体指令的,要不我也不会这么麻烦的用win32 sdk编程。果然要只学习图像算法,还是推荐matlab。这里主要用了pcmpgtb指令格式 pcmpgtb mm0,mm1;解释:当 mm0 中对应字节大于 mm1对应字节时,mm0相应位置置0xff,否则置0x00。当然,相关还有pcmpgtw等。详见这里//本程序算是一个简单的框架了,可以用来处理图像//主要是用来学习多媒体指令mmx/sse相关的。#include <windows.h>#include <gdiplus.h>#pragma comment(lib, "gdiplus.lib&
阅读全文
摘要:mmx指令:movq:移动8个字节。paddb:每1个字节作为一个整体单元相加。emms:mmx指令结束标志。#include <iostream>#include <windows.h>#include <gdiplus.h> //为将来使用GDI+处理图像做准备#pragma comment(lib, "gdiplus.lib")using namespace Gdiplus;using namespace std;typedef union{ ARGB Color; struct { BYTE Blue; BYTE Green; .
阅读全文
摘要:#include <iostream>using namespace std;int main(int argc, char* argv[]){ float a[8]={1,2,3,4,5,6,7,8}; float b[8]={1,2,3,4,5,6,7,8}; float c[8]; //两个数组相乘的结果 __asm { mov ebx,0; mov ecx,2; //循环两次 lp: movups xmm0,[a+ebx]; //一次存入xmm中...
阅读全文