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

string

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

基于sse2的strstr函數

Posted on 2008-10-28 21:47 djx_zh 閱讀(2912) 評論(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函數的設計還這么復雜
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲日本中文字幕免费在线不卡| 午夜精品www| 欧美成人三级在线| 欧美成人xxx| 蜜臀91精品一区二区三区| 久久精品欧洲| 麻豆成人在线| 欧美视频在线看| 国产精品av一区二区| 国产日韩一区二区三区| 欧美高清在线视频| 国产精品一区二区黑丝| 亚洲国产精品v| 欧美国产亚洲视频| 欧美一级黄色网| 国产精品国色综合久久| 亚洲一区二区综合| 久久精品亚洲精品| 夜夜嗨av一区二区三区免费区| 亚洲国产精品第一区二区| 欧美电影打屁股sp| 久久精品国产第一区二区三区最新章节| 国产精品亚洲片夜色在线| 欧美亚洲免费电影| 国产亚洲成av人在线观看导航| 小处雏高清一区二区三区| 亚洲一区二区综合| 欧美日韩一级黄| 久久久亚洲午夜电影| 欧美成人精品h版在线观看| 在线视频国产日韩| 亚洲精品一区二区在线观看| 国产精品一区二区在线| 欧美屁股在线| 国产欧美在线视频| 亚洲午夜国产一区99re久久 | 亚洲福利视频在线| 在线综合+亚洲+欧美中文字幕| 久久婷婷国产综合国色天香| 亚洲精品在线免费| 久久精品国产99| 国产精品欧美风情| 欧美一二三视频| 香蕉成人伊视频在线观看| 国产精品久久婷婷六月丁香| 一本色道久久综合亚洲精品婷婷| 亚洲国内精品| 欧美四级伦理在线| 欧美一区中文字幕| 久久精品最新地址| 欧美一进一出视频| 久久国产精品99国产| 一二三区精品| 一区二区三区在线高清| 亚洲国产精选| 国产精品卡一卡二卡三| 久久久久中文| 欧美日韩国产二区| 久久久人成影片一区二区三区| 久久国产精品久久精品国产 | 午夜精品免费在线| 久久精品久久99精品久久| 久久国产手机看片| 亚洲欧美综合v| 亚洲美女精品久久| 欧美成人在线影院| 久久国产毛片| 欧美午夜视频一区二区| 欧美成人精品1314www| 国产一区二区三区免费在线观看| 欧美国产日韩一二三区| 国产综合视频在线观看| 一区二区三区四区精品| 久久成人一区| 日韩午夜中文字幕| 久久亚洲综合色| 久久久www成人免费毛片麻豆| 欧美少妇一区二区| 久久精品麻豆| 亚洲欧美国产另类| 亚洲一区久久久| 国产精品高潮在线| 性欧美video另类hd性玩具| 欧美一二三区在线观看| 国产日本欧美在线观看| 久久伊人精品天天| 亚洲黄色在线看| 中文亚洲欧美| 国内精品伊人久久久久av一坑| 欧美一区激情| 亚洲另类在线一区| 久久精品国产亚洲一区二区| 亚洲福利视频网站| 亚洲精品自在在线观看| 免费av成人在线| 亚洲福利视频一区二区| 欧美激情欧美激情在线五月| 亚洲最新在线| 欧美成人一区二免费视频软件| 亚洲电影在线播放| 欧美日韩蜜桃| 欧美福利电影网| 久久国产手机看片| 中文av字幕一区| 美日韩精品视频免费看| 亚洲视频自拍偷拍| 亚洲三级视频| 亚洲大胆美女视频| 国产自产精品| 国产欧美日韩| 国产精品视频yy9299一区| 欧美激情一区二区三级高清视频| 亚洲一区二区免费| 亚洲作爱视频| 99riav国产精品| 亚洲伦理在线观看| 91久久精品一区二区别| 激情欧美一区二区三区| 国产亚洲精品v| 一区二区三区在线免费播放| 国产一区再线| 亚洲国产精品成人| 亚洲免费观看在线视频| 91久久久久久| 一区二区三区久久网| 亚洲午夜在线观看| 一二三区精品| 亚洲欧美日韩在线不卡| 欧美一区二区成人| 久久最新视频| 99re66热这里只有精品4| 在线亚洲高清视频| 久久久久国产精品午夜一区| 欧美激情按摩| 国产亚洲欧美一区二区三区| 亚洲国产精品va| 香港久久久电影| 亚洲欧洲一区二区在线播放| 在线观看欧美日本| 欧美丝袜一区二区| 精品电影一区| 亚洲欧美日韩另类| 亚洲国产视频直播| 欧美在线视频二区| 国产精品对白刺激久久久| 亚洲黑丝一区二区| 欧美96在线丨欧| 久久久av毛片精品| 国内自拍视频一区二区三区 | 欧美成人一区二区三区在线观看| 亚洲狠狠丁香婷婷综合久久久| 欧美在线日韩在线| 久久成人综合视频| 欧美色网在线| 中文在线不卡| 一区二区三区av| 国产精品国产三级国产aⅴ浪潮| 亚洲精品亚洲人成人网| 亚洲第一页在线| 欧美激情1区2区3区| 亚洲视频欧美在线| 欧美一区二区三区喷汁尤物| 黄色精品网站| 日韩午夜av电影| 午夜精品久久久久久久久久久久久| 亚洲国产日韩欧美在线动漫| 麻豆精品一区二区综合av| 99re热这里只有精品免费视频| 一区二区三区免费网站| 国产精品久久网站| 欧美激情网友自拍| 国产精品乱人伦中文| 久久综合影视| 国产精品伦子伦免费视频| 欧美电影在线免费观看网站| 欧美日韩国产欧| 久久久欧美一区二区| 欧美私人啪啪vps| 亚洲成人中文| 狠狠色狠狠色综合| 亚洲日本中文字幕| 国产精品入口| 裸体歌舞表演一区二区| 欧美三级特黄| 亚洲精品欧美专区| 影音先锋中文字幕一区| 亚洲自拍偷拍色片视频| 亚洲精品乱码久久久久久日本蜜臀| 亚洲一二三区在线观看| 亚洲桃花岛网站| 欧美视频不卡| 99视频日韩| 亚洲欧美精品伊人久久| 国产精品久久久久永久免费观看| 亚洲国产精品精华液网站| 亚洲青涩在线| 欧美日韩在线综合| 一区二区久久| 久久精品最新地址| 亚洲自拍都市欧美小说|