string
string
posts - 27, comments - 177, trackbacks - 0, articles - 0
C++博客
::
首頁(yè)
::
新隨筆
::
聯(lián)系
::
聚合
::
管理
基于sse2的strstr函數(shù)
Posted on 2008-10-28 21:47
djx_zh
閱讀(2884)
評(píng)論(7)
編輯
收藏
引用
download the code
昨天實(shí)現(xiàn)了基于int類型的strstr函數(shù),可以獲得1~2X左右的加速。今天按 lstrstr的流程實(shí)現(xiàn)了基于SSE2的STRSTR函數(shù)。可以得到2~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
]
==
0
)
return
NULL;
15
if
(pattern[
1
]
==
0
)
return
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]
==
0
)
return
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]
==
0
)
return
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]
==
0
)
return
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]
==
0
)
return
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]
==
0
)
return
bytePtr;
88
if
(bytePtr[i]
==
0
)
return
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]
==
0
)
return
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]
==
0
)
return
bytePtr;
131
if
(bytePtr[i]
==
0
)
return
NULL;
132
133
}
134
bytePtr
++
;
135
}
136
}
137
}
138
return
NULL;
139
}
140
Feedback
#
re: 基于sse2的strstr函數(shù)
回復(fù)
更多評(píng)論
2008-10-30 00:53 by
肥仔
超過了C的strstr?
#
re: 基于sse2的strstr函數(shù)
回復(fù)
更多評(píng)論
2008-10-30 09:33 by
djxzh
@肥仔
就目前的測(cè)試結(jié)果,是這樣。還沒有測(cè)試最壞情況下會(huì)是什么結(jié)果。
#
re: 基于sse2的strstr函數(shù)[未登錄]
回復(fù)
更多評(píng)論
2008-10-30 10:35 by
megax
做一個(gè)從后面開始查找的試試?
#
re: 基于sse2的strstr函數(shù)
回復(fù)
更多評(píng)論
2008-10-30 10:41 by
djxzh
@megax
你是說(shuō)BM之類的算法嗎?那些算法需要對(duì)模式串預(yù)處理。
#
re: 基于sse2的strstr函數(shù)
回復(fù)
更多評(píng)論
2008-10-30 10:54 by
vczh
用了SSE的指令集就可以同時(shí)計(jì)算一小部分內(nèi)容了。
#
re: 基于sse2的strstr函數(shù)[未登錄]
回復(fù)
更多評(píng)論
2008-10-31 12:47 by
megax
不是,我說(shuō)的是從一個(gè)字符串后面開始查找想要查找的內(nèi)容。不是說(shuō)具體的算法
#
re: 基于sse2的strstr函數(shù)
回復(fù)
更多評(píng)論
2008-11-01 11:02 by
金山詞霸2008
沒想到strstr函數(shù)的設(shè)計(jì)還這么復(fù)雜
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
【推薦】100%開源!大型工業(yè)跨平臺(tái)軟件C++源碼提供,建模,組態(tài)!
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
Powered by:
C++博客
Copyright © djx_zh
日歷
<
2008年10月
>
日
一
二
三
四
五
六
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
常用鏈接
我的隨筆
我的評(píng)論
我參與的隨筆
留言簿
(28)
給我留言
查看公開留言
查看私人留言
隨筆檔案
2020年9月 (1)
2015年7月 (1)
2015年2月 (2)
2015年1月 (1)
2014年12月 (1)
2013年12月 (1)
2013年5月 (1)
2013年3月 (1)
2012年12月 (1)
2012年6月 (1)
2012年4月 (1)
2012年3月 (3)
2012年2月 (1)
2012年1月 (1)
2011年10月 (2)
2010年6月 (1)
2010年5月 (1)
2009年7月 (2)
2009年2月 (1)
2008年11月 (1)
2008年10月 (2)
搜索
最新評(píng)論
1.?re: 搬家
新博客無(wú)法訪問啊,請(qǐng)問現(xiàn)在是什么狀況了?
--Achilles
2.?re: UEFI實(shí)戰(zhàn)(1)
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--yayake
3.?re: UEFI 實(shí)戰(zhàn)(4) protocol 之利用Protocol提供視頻解碼服務(wù)
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--djxzh
4.?re: UEFI 實(shí)戰(zhàn)(4) protocol 之利用Protocol提供視頻解碼服務(wù)
@Amin
樓主,可否發(fā)一份64位的給我,謝謝。568900705@qq.com
--pingl
5.?re: UEFI 實(shí)戰(zhàn)(4) protocol 之利用Protocol提供視頻解碼服務(wù)
樓主,可否發(fā)一份64位的給我,謝謝。568900705@qq.com
--pingl
閱讀排行榜
1.?深入U(xiǎn)EFI內(nèi)核(一)ResetVector(30020)
2.?UEFI 實(shí)戰(zhàn)(2) HelloWorld 之一 helloworld及.inf文件(26887)
3.?UEFI實(shí)戰(zhàn)(1)(18701)
4.?UEFI 實(shí)戰(zhàn)(4) protocol (18058)
5.?UEFI實(shí)戰(zhàn)(5) driver(16840)
評(píng)論排行榜
1.?UEFI 實(shí)戰(zhàn)(2) HelloWorld 之一 helloworld及.inf文件(47)
2.?UEFI 實(shí)戰(zhàn)(4) protocol 之利用Protocol提供視頻解碼服務(wù)(20)
3.?UEFI 實(shí)戰(zhàn)(4) protocol (18)
4.?UEFI實(shí)戰(zhàn)(1)(16)
5.?《UEFI原理與編程》勘誤(16)
99国产欧美精品久久久蜜芽
|
久久久久99精品成人片三人毛片
|
亚洲精品无码久久久久去q
|
99久久成人国产精品免费
|
久久久久久人妻无码
|
久久涩综合
|
久久精品国产亚洲5555
|
久久久久免费精品国产
|
久久精品成人免费国产片小草
|
国产精品美女久久久久久2018
|
亚洲精品乱码久久久久久蜜桃
|
青青草国产精品久久
|
亚洲综合伊人久久综合
|
久久AV高潮AV无码AV
|
国产精品久久久久久久午夜片
|
91久久精品国产成人久久
|
久久99国产亚洲高清观看首页
|
99久久精品国内
|
久久人人爽人人爽人人爽
|
精品久久久久国产免费
|
亚洲精品蜜桃久久久久久
|
国产成人久久久精品二区三区
|
三上悠亚久久精品
|
久久国产欧美日韩精品
|
要久久爱在线免费观看
|
久久精品国产99久久香蕉
|
国产精品对白刺激久久久
|
一级a性色生活片久久无
|
狠狠色综合网站久久久久久久
|
久久香蕉综合色一综合色88
|
精品久久久久香蕉网
|
亚洲国产一成人久久精品
|
国产一区二区久久久
|
无码人妻久久久一区二区三区
|
日本精品久久久久中文字幕8
|
精品熟女少妇a∨免费久久
|
久久久久人妻一区精品色
|
亚洲午夜久久久久久久久久
|
亚洲AV日韩精品久久久久久久
|
久久精品人妻中文系列
|
亚洲色欲久久久综合网东京热
|