青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

string

string
posts - 27, comments - 177, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

基于sse2的strstr函數

Posted on 2008-10-28 21:47 djx_zh 閱讀(2922) 評論(7)  編輯 收藏 引用
 download the code
昨天實現了基于int類型的strstr函數,可以獲得1~2X左右的加速。今天按 lstrstr的流程實現了基于SSE2的STRSTR函數??梢缘玫?~4X左右的加速。
  1 char* lstrstrsse(char* text, char* pattern)
  2 {
  3     __m128i * sseiPtr = (__m128i *) text;
  4     unsigned char * chPtrAligned = (unsigned char*)text;
  5     __m128i sseiWord0 ;//= *sseiPtr ;
  6     __m128i sseiWord1 ;//= *sseiPtr ;
  7     __m128i sseiZero = _mm_set1_epi8(0);
  8     char chara = pattern[0];
  9     char charb = pattern[1];
 10     register __m128i byte16a;
 11     register __m128i byte16b;
 12     char* bytePtr =text;
 13     if(pattern ==NULL) return NULL;
 14     if(pattern[0== 0return NULL;
 15     if(pattern[1== 0return lstrchr(text,pattern[0]); 
 16     byte16a = _mm_set1_epi8(chara);
 17     byte16b = _mm_set1_epi8(charb);
 18 // process the unaligned bytes
 19 
 20 // the aligned bytes
 21 alignStart:
 22     sseiWord0 = *sseiPtr;
 23     sseiWord1 = *(sseiPtr+1);
 24     while( haszeroByte(sseiWord0,sseiWord1,sseiZero) ==0
 25     {
 26         unsigned int reta ;
 27 searcha:
 28         reta = hasByteC(sseiWord0,sseiWord1,  byte16a);
 29         if(reta!=0 ) {
 30             unsigned int retb ;
 31 findouta:        
 32             retb = hasByteC(sseiWord0,sseiWord1,  byte16b);
 33 findoutb:
 34             if(((reta<<1& retb)){
 35                 // have ab
 36                 int i=1;
 37                 char * bytePtr0 = (char*) ( sseiPtr );
 38                 int j;
 39                 //printf("test::%0x,%d\n",reta ,bytePtr0 -text);
 40                 bytePtr = (char*) ( sseiPtr );
 41                 for(j =0;j<8;j++){
 42                     if(reta & 0xff) {
 43                         if(bytePtr0[0== chara){
 44                             i =1;
 45                             bytePtr = bytePtr0 ;
 46                             while((pattern[i] )&&(bytePtr[i] == pattern[i])) i++;
 47                             if(pattern[i] == 0return bytePtr;
 48                         }
 49                         if(bytePtr0[1== chara){
 50                             i =1;
 51                             bytePtr = bytePtr0 + 1;
 52                             while((pattern[i] )&&(bytePtr[i] == pattern[i])) i++;
 53                             if(pattern[i] == 0return bytePtr;
 54                         }
 55                         if(bytePtr0[2== chara){
 56                             i =1;
 57                             bytePtr = bytePtr0 + 2;
 58                             while((pattern[i] )&&(bytePtr[i] == pattern[i])) i++;
 59                             if(pattern[i] == 0return bytePtr;
 60                         }
 61                         if(bytePtr0[3== chara){
 62                             i =1;
 63                             bytePtr = bytePtr0 + 3;
 64                             while((pattern[i] )&&(bytePtr[i] == pattern[i])) i++;
 65                             if(pattern[i] == 0return bytePtr;
 66                         }
 67                     }
 68                     reta = reta >> 4;
 69                     bytePtr0 += 4;
 70                 }
 71             }
 72             // search b
 73             sseiPtr += 2;
 74             sseiWord0 = *sseiPtr;
 75             sseiWord1 = *(sseiPtr+1);
 76 
 77             while( haszeroByte(sseiWord0,sseiWord1,sseiZero) ==0){ 
 78                 retb = hasByteC(sseiWord0,sseiWord1,  byte16b);
 79                 if(retb !=0){
 80                     // findout b
 81                     if((*((char*) sseiPtr)) == charb){
 82                         //b000
 83                         char * bytePtr = ((char*) ( sseiPtr )) -1;
 84                         if(bytePtr[0== chara){
 85                             int i=1;
 86                             while((pattern[i] )&&(bytePtr[i] == pattern[i])) i++;
 87                             if(pattern[i] == 0return bytePtr;
 88                             if(bytePtr[i] == 0return NULL;
 89                         }
 90 
 91                     }
 92                     reta = hasByteC(sseiWord0,sseiWord1,  byte16a);
 93                     if(reta !=0
 94                         goto findoutb;
 95                     else{
 96                         goto nextWord;                    
 97                     }
 98                 }
 99                 sseiPtr += 2;
100                 sseiWord0 = *sseiPtr;
101                 sseiWord1 = *(sseiPtr+1);
102             }
103             // search  from (char*)sseiPtr
104             char * bytePtr = ((char*) ( sseiPtr )) -1;
105             if(bytePtr[0== chara){
106                 int i=1;
107                 while((pattern[i] )&&(bytePtr[i] == pattern[i])) i++;
108                 if(pattern[i] == 0return bytePtr;
109             }
110 
111             goto prePareForEnd;
112         }
113 nextWord:
114         sseiPtr += 2;
115         sseiWord0 = *sseiPtr;
116         sseiWord1 = *(sseiPtr+1);
117     }
118 prePareForEnd:
119     {
120         unsigned int reta;
121         unsigned int retb;
122         reta =hasByteC(sseiWord0,sseiWord1,  byte16a);
123         retb =hasByteC(sseiWord0,sseiWord1,  byte16b);
124         if(((reta<<1& retb)){
125             bytePtr = (char*)sseiPtr;
126             while(*bytePtr){
127                 if(*bytePtr == chara) {
128                     int i=1;
129                     while((pattern[i] )&&(bytePtr[i] == pattern[i])) i++;
130                     if(pattern[i] == 0return bytePtr;
131                     if(bytePtr[i] == 0return NULL;
132 
133                 }
134                 bytePtr++;
135             }
136         }
137     }
138     return NULL;
139 }
140 

Feedback

# re: 基于sse2的strstr函數  回復  更多評論   

2008-10-30 00:53 by 肥仔
超過了C的strstr?

# re: 基于sse2的strstr函數  回復  更多評論   

2008-10-30 09:33 by djxzh
@肥仔
就目前的測試結果,是這樣。還沒有測試最壞情況下會是什么結果。

# re: 基于sse2的strstr函數[未登錄]  回復  更多評論   

2008-10-30 10:35 by megax
做一個從后面開始查找的試試?

# re: 基于sse2的strstr函數  回復  更多評論   

2008-10-30 10:41 by djxzh
@megax
你是說BM之類的算法嗎?那些算法需要對模式串預處理。

# re: 基于sse2的strstr函數  回復  更多評論   

2008-10-30 10:54 by vczh
用了SSE的指令集就可以同時計算一小部分內容了。

# re: 基于sse2的strstr函數[未登錄]  回復  更多評論   

2008-10-31 12:47 by megax
不是,我說的是從一個字符串后面開始查找想要查找的內容。不是說具體的算法

# re: 基于sse2的strstr函數  回復  更多評論   

2008-11-01 11:02 by 金山詞霸2008
沒想到strstr函數的設計還這么復雜

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            快射av在线播放一区| 欧美—级a级欧美特级ar全黄| 欧美午夜剧场| 亚洲欧美日韩中文在线制服| 亚洲日本无吗高清不卡| 欧美成人亚洲| 国产精品99久久久久久www| 一区二区三区日韩在线观看| 国产精品国产三级国产| 久久九九热免费视频| 久久全球大尺度高清视频| 亚洲电影第1页| 亚洲精品中文字| 国产精品美女一区二区| 久久―日本道色综合久久| 另类春色校园亚洲| 一区二区三区高清在线| 新片速递亚洲合集欧美合集 | 最新亚洲电影| 欧美午夜精品久久久久久浪潮| 亚洲欧美日韩一区| 久久久久国产一区二区三区四区| 最新国产成人在线观看| 亚洲深夜福利在线| 在线日韩视频| 亚洲欧美精品在线| 亚洲日本va在线观看| 亚洲综合色激情五月| 亚洲国产精品久久久久婷婷884| 日韩写真视频在线观看| 伊人春色精品| 亚洲新中文字幕| 亚洲电影一级黄| 午夜免费久久久久| 99re6这里只有精品| 久久国产加勒比精品无码| 亚洲最新合集| 久久亚洲精品中文字幕冲田杏梨| 亚洲综合第一| 欧美激情一区二区三区| 久久综合图片| 国产欧美日韩一区二区三区在线 | 牛牛影视久久网| 欧美午夜在线| 亚洲国产精品视频一区| 国产一区欧美日韩| 一区二区高清视频| 亚洲美女免费视频| 久久嫩草精品久久久精品| 欧美在线一区二区| 欧美午夜无遮挡| 9l国产精品久久久久麻豆| 亚洲国产欧美一区二区三区同亚洲 | 亚洲女人av| 99视频日韩| 欧美不卡视频一区| 免费欧美电影| 尤物精品在线| 久久不射中文字幕| 久久精品一区四区| 国产欧美日韩视频| 亚洲一区美女视频在线观看免费| 一区二区三区高清在线| 欧美精品色网| 99精品免费| 亚洲视频一区二区| 欧美日韩一区二区欧美激情| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲黄色成人| 欧美成人国产| 亚洲精品黄网在线观看| 在线一区欧美| 国产精品福利久久久| 亚洲一区二区三区在线视频| 亚洲欧美日韩国产综合精品二区| 国产精品久久久久久久7电影| 99精品视频免费观看视频| 亚洲一区二区少妇| 国产精品视频久久一区| 亚洲欧美日韩国产中文| 久久久久国产精品午夜一区| 国产一区在线看| 另类综合日韩欧美亚洲| 亚洲国产cao| 亚洲在线免费| 狠狠色狠狠色综合| 欧美777四色影视在线| 亚洲片在线观看| 欧美一级视频免费在线观看| 国产一区二区日韩精品| 毛片一区二区三区| 一本大道久久a久久综合婷婷| 欧美一区二区免费| 亚洲福利在线观看| 国产精品mm| 久久久久国色av免费看影院| 亚洲人成毛片在线播放| 久久riav二区三区| 亚洲人成7777| 国产老肥熟一区二区三区| 久久久久国色av免费观看性色| 亚洲国产黄色| 久久久久久久一区二区| 亚洲精品中文字| 国产一区二区精品| 欧美日韩精品在线视频| 久久国产精品久久国产精品| 亚洲第一二三四五区| 久久精品视频免费观看| 亚洲伦理自拍| 狠狠色综合日日| 欧美亚洲成人精品| 欧美电影免费观看高清| 亚洲在线成人| 日韩午夜黄色| 欧美激情精品久久久| 欧美亚洲三级| 亚洲少妇自拍| 亚洲看片一区| 亚洲高清在线播放| 国产亚洲欧美一区| 国产精品欧美一区二区三区奶水| 男女激情视频一区| 久久久www免费人成黑人精品| 一区二区日韩| 亚洲免费成人| 亚洲国产一区二区精品专区| 裸体歌舞表演一区二区| 久久激情视频| 欧美在线综合视频| 亚洲欧美综合精品久久成人| 日韩一级视频免费观看在线| 一区在线免费| 一区二区三区在线免费视频| 国产欧美一区二区三区另类精品 | 欧美日韩在线观看视频| 欧美国产日产韩国视频| 麻豆av福利av久久av| 久久不射2019中文字幕| 欧美一区免费视频| 欧美在线二区| 久久精品日韩| 久久久久欧美精品| 久久综合电影一区| 麻豆av一区二区三区久久| 久久青草久久| 欧美国产视频在线观看| 欧美激情一区二区三区四区| 欧美激情亚洲自拍| 免费观看国产成人| 欧美ab在线视频| 欧美日本不卡视频| 欧美色视频在线| 国产精品视频网| 国产精品视频999| 国产美女诱惑一区二区| 国产视频久久久久| 伊人成人开心激情综合网| 亚洲国产高清高潮精品美女| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲大片av| 日韩视频在线观看免费| 亚洲新中文字幕| 久久国产精品网站| 美脚丝袜一区二区三区在线观看 | 欧美日韩国产一区| 欧美亚州韩日在线看免费版国语版| 国产精品国产三级欧美二区 | 欧美揉bbbbb揉bbbbb| 国产精品色网| 狠狠色狠狠色综合日日91app| 亚洲二区在线视频| 亚洲综合国产激情另类一区| 久久国产精品99精品国产| 欧美成人tv| 亚洲色图综合久久| 久久狠狠亚洲综合| 欧美精品一区二| 国产精品视频在线观看| 国产日韩一区在线| 亚洲人成人一区二区在线观看| 亚洲伊人伊色伊影伊综合网| 久久久久久久久久看片| 亚洲激情视频在线| 欧美中文字幕在线观看| 欧美人与性动交cc0o| 国产一区二区三区高清| 一本色道久久综合狠狠躁的推荐| 欧美在线视频不卡| 91久久精品一区| 久久爱另类一区二区小说| 欧美视频在线观看 亚洲欧| 一区二区三区在线视频观看| 亚洲视频福利| 欧美国产日韩一区二区三区| 亚洲一二区在线| 欧美精品一级| 亚洲欧洲日产国产综合网| 久久精品国产免费看久久精品| 亚洲人精品午夜在线观看|