C_and_CPP 板


LINE

試著練習一下 37 /* Handle the first few characters by reading one character at a time. 38 Do this until CHAR_PTR is aligned on a longword boundary. */ 39 for (char_ptr = str; ((unsigned long int) char_ptr 40 & (sizeof (longword) - 1)) != 0; 41 ++char_ptr) 42 if (*char_ptr == '\0') 43 return char_ptr - str; 這邊註解寫的很清楚 把 char pointer 對齊到 long* 的位置 這樣之後我們一次就可以比一個 long 59 magic_bits = 0x7efefeffL; 60 himagic = 0x80808080L; 61 lomagic = 0x01010101L; 62 if (sizeof (longword) > 4) 63 { 66 magic_bits = ((0x7efefefeL << 16) << 16) | 0xfefefeffL; 67 himagic = ((himagic << 16) << 16) | himagic; 68 lomagic = ((lomagic << 16) << 16) | lomagic; 69 } 70 if (sizeof (longword) > 8) 71 abort (); magic number 先跳過 不過方便起見之後假設 long 是 4B 76 for (;;) 77 { 107 longword = *longword_ptr++; 這個跟你的寫法差不多 不過他現在就是要一次比 4B 108 109 if ( 122 ((longword - 0x01010101) & 0x80808080) 124 != 0) 125 { 整個程式裡面神奇的只有這個 我把 magic number 展開了 如果 4B 裡面有 0 那麼每個 byte 減掉 1 的時候就會退位 導致該 byte 前面的 byte 的 MSB 是 1 128 129 const char *cp = (const char *) (longword_ptr - 1); 130 131 if (cp[0] == 0) 132 return cp - str; 133 if (cp[1] == 0) 134 return cp - str + 1; (下略) 承上 會進來這邊就是他認為這 4B 裡面有可能 0x00 這邊就是把 loop 展開 -- 其實我只是把註解翻譯而已 w --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.175.53
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1430234649.A.AAD.html
1F:推 EdisonX: vc 也是用這種作法 , 只是它已包成了 strlen.asm ,所以.. 04/28 23:30
2F:推 OPIV: 抱歉...J大 我不太了解loop展開的意思 04/28 23:32
3F:→ OPIV: 意思是,把原本的逐位檢查改成if()if()if()嗎? 04/28 23:33
4F:推 LiloHuang: http://www.xuebuyuan.com/1636638.html 這篇看看 04/28 23:34
5F:→ johnjohnlin: loop unrolling 04/28 23:43
6F:→ PkmX: glibc的實作真變態 比我用AVX2一次比對32 bytes還要快... 04/29 01:31
8F:→ johnjohnlin: 測試了一下,發現真的會快一點點,到底為什麼啊 04/29 12:45
9F:→ PkmX: 可能glibc的版本我的cpu的micro-architecture比較喜歡吧XDrz 04/29 13:08
10F:→ PkmX: 不過基本上差距都在5%以內 所以可接受 04/29 13:09
11F:→ TobyH4cker: 應該是有對齊比較符合CPU的運作方式 04/29 16:02
12F:→ TobyH4cker: 這部分只要看編譯後的asm就能比較了 04/29 16:03
13F:→ PkmX: 我的AVX2版本也有先對齊啊XDrz 04/29 18:58
14F:推 LiloHuang: 因為 glibc 的實作裡頭有 SSE2 的版本也有 SSE4 04/29 20:41
15F:→ LiloHuang: 詳見 http://goo.gl/kzQ9sX 04/29 20:42
16F:推 LiloHuang: 剩下就是得分析此情況下 AVX2 跟 SSE4 為啥會輸了 :P 04/29 20:46
17F:→ LiloHuang: 這篇比較的表格也許可以看看 http://goo.gl/G04iPI 04/29 20:51
18F:→ LiloHuang: 說不定你的 glibc 剛好有 AVX2 實作也不一定 XD 04/29 20:51
19F:→ LiloHuang: 用 gdb 下個斷點 step into 進去 strlen 看看應該可知 04/29 20:52
20F:→ johnjohnlin: 我比較的對象是上一篇那個純 C 的實作 04/29 22:39
21F:→ johnjohnlin: 另外我有點好奇這樣不會出現違規存取的問題嗎? 04/29 22:39
22F:→ johnjohnlin: 我電腦裡面的是 SSE2 實作,速度跟純 C 很接近 04/29 22:42
23F:→ PkmX: 基本上你的memory access都是align在4或8 bytes上 04/30 08:25
24F:→ PkmX: 不會有跨越page的問題 所以在x86上面ok 04/30 08:26







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP