2012-04-09 64 views
4

假設我有在128位變量16個ASCII字符(因此16個8位數字)/註冊多個號碼的位掩碼。我想創建一個位掩碼,其中這些位將是高位,其位位置(索引)由這16個字符表示。有效的方式來創建從可能使用SSE/SSE2/SSE3/SSE4指令

例如,如果由這16個字符構成的字符串是"CAD...",則在位掩碼的第67位,第65位,第68位等應爲1.其餘位應爲0.其效率是多少?專門使用SIMD指令做的方法?

我知道其中的一種技術是這樣的:2^(67-1)+2^(65-1)+2^(68-1)+... 但是這將需要大量的操作。如果可能的話,我想在一個/兩個操作/指令中完成。

請讓我知道解決辦法。

+2

聽起來你對發生的或有缺字母的測試? – Mysticial 2012-04-09 03:23:56

+1

我不認爲甚至AVX2聚集/分散可以爲評論這樣做有效地... – Mysticial 2012-04-09 03:26:39

+0

@Mystical,謝謝。是的你的權利,我試圖測試發生或丟失的字符。你能想象任何其他方法比強力(兩個冪的加法)方法更好嗎? – 2012-04-09 09:12:55

回答

4

SSE4.2包含一個指令,你想要什麼,執行幾乎:PCMPISTRM立即操作數0它的一個操作數應該包含您的ASCII字符的,其他 - 常數向量與價值觀像32,33,47 ... 。你得到的結果是XMM0的16個最低有效位。由於您需要128位,因此應該使用不同的常量向量執行該指令8次(如果只需要可打印的ASCII字符,則需要執行6次)。每個PCMPISTRM後,使用按位OR將結果累加到某個XMM寄存器中。 (1)您需要閱讀英特爾架構軟件開發人員手冊以瞭解PCMPISTRM的詳細信息,因爲這可能是有史以來最複雜的SSE指令,(2)此指令非常慢(吞吐量在Nehalem上爲1/2,在Sandy Bridge上爲1/3,在推土機上爲1/4),所以與'蠻力'方法相比,你幾乎不會有任何顯着的速度提升。

+0

謝謝Evgeny Kluev。我知道這是一種效率不高的方式。但現在可能沒有更好的辦法了。 – 2012-04-10 03:32:42

相關問題