Performance 什么是一个单词中空格的快速方法?

Performance 什么是一个单词中空格的快速方法?,performance,bitwise-operators,Performance,Bitwise Operators,我在64位寄存器的下部有一个32位值;顶部为0 X表示包含信息的位,从LSB到MSB列出的位: X X X ... X 0 0 0 0 ... 0 现在,我想用信息隔开这些位,这样我就 X 0 X 0 X 0 ... X 0 或者如果你想把0放在第一位,那么 0 X 0 X 0 X 0 ... X 我也很好 什么是快速的方法 与多CPU体系结构相关的答案会很好,但与Intel x86_64和/或nVIDIA Pascal SM相关的东西将是最相关的。这被称为,这是并行扩展的一种特殊情况

我在64位寄存器的下部有一个32位值;顶部为0 X表示包含信息的位,从LSB到MSB列出的位:

X X X  ...  X 0 0 0 0 ... 0
现在,我想用信息隔开这些位,这样我就

X 0 X 0 X 0 ... X 0
或者如果你想把0放在第一位,那么

0 X 0 X 0 X 0 ... X
我也很好

什么是快速的方法

与多CPU体系结构相关的答案会很好,但与Intel x86_64和/或nVIDIA Pascal SM相关的东西将是最相关的。

这被称为,这是并行扩展的一种特殊情况,而在以下问题中,并行扩展又与压缩相反

一个普遍的解决办法可能是

uint64位扩展uint64位扩展uint64位扩展x//00000000 ABCDEFGH { x=x&0xFFFF0000 8;//AB00CD00EF00GH00 x=x&0xF000F000F000F000 | x&0x0F000F000F000F000>>4;//A0B0C0D0E0F0G0H0 x=x&0xC0C0C0C0C0 | x&0x3030303030>>2; x=x&0xA0A0A0A0 | x&0x50505050>>1; 返回x; } 然而,在RISC体系结构上,常量生成可能效率低下,因为64位立即数不能像x86那样存储在一条指令中。甚至在x86上。下面是另一个可能的实现,如上所述

静态常量无符号整数B[]={0x55555555,0x33333333,0x0F0F0F,0x00FF00FF}; 静态常量无符号整数S[]={1,2,4,8}; 无符号整数x;//交错x和y的较低16位,因此x的位 无符号整数y;//位于偶数位置,y的位位于奇数位置; 无符号整数z;//z获取得到的32位莫顿数。 //x和y最初必须小于65536。 x=x | x>49&0x5555| y*0x0101010101010101LL和0x804020100804020100ULL* 0x0102040810204081ULL>>48&0xAAAA; 更多的解决方案可以在

相关的:

正如您所看到的,如果没有bit-deposit指令,操作将非常复杂。如果您没有像这样执行位条带化,那么最好使用SIMD并行执行,这就是所谓的,这是并行扩展的一种特殊情况,而在下面的问题中,并行扩展又与压缩相反

一个普遍的解决办法可能是

uint64位扩展uint64位扩展uint64位扩展x//00000000 ABCDEFGH { x=x&0xFFFF0000 8;//AB00CD00EF00GH00 x=x&0xF000F000F000F000 | x&0x0F000F000F000F000>>4;//A0B0C0D0E0F0G0H0 x=x&0xC0C0C0C0C0 | x&0x3030303030>>2; x=x&0xA0A0A0A0 | x&0x50505050>>1; 返回x; } 然而,在RISC体系结构上,常量生成可能效率低下,因为64位立即数不能像x86那样存储在一条指令中。甚至在x86上。下面是另一个可能的实现,如上所述

静态常量无符号整数B[]={0x55555555,0x33333333,0x0F0F0F,0x00FF00FF}; 静态常量无符号整数S[]={1,2,4,8}; 无符号整数x;//交错x和y的较低16位,因此x的位 无符号整数y;//位于偶数位置,y的位位于奇数位置; 无符号整数z;//z获取得到的32位莫顿数。 //x和y最初必须小于65536。 x=x | x>49&0x5555| y*0x0101010101010101LL和0x804020100804020100ULL* 0x0102040810204081ULL>>48&0xAAAA; 更多的解决方案可以在

相关的:


正如您所看到的,如果没有bit-deposit指令,操作将非常复杂。如果您没有像这样执行一点条带化,那么最好使用SIMD并行执行。您说过顶部为0,但实际上底部为0@LưuVĩnhPhúc:我从头到尾列出了位,请参见编辑。您说过顶部为0,但实际上底部为0@LưuVĩnhPhúc:我从头到尾列出了这些位,请参阅编辑。因此,除了硬件指令外,所有这些选项在指令数量方面似乎都非常慢,即使允许编译器优化。我知道这会很慢,因为它需要大量的转换,就像便携式压缩解决方案一样。您是否尝试使用16位或22位查找表?抱歉,没有回答。不,我没有,因为LUT在没有很好缓存的架构上实际上是不相关的;在x86_64上,您给了我PDEP建议。不过我还是喜欢你。。。顺便问一下,PDEP有一个简单的版本吗?如果你在每一步都需要大量的按位操作,不管缓存是否存在,LUT方法仍然很快。不幸的是,PDEP没有矢量化版本。看到了吧,除了硬件指令,所有这些选项在指令数量方面似乎都很慢,即使允许编译器优化。我知道它会很慢,因为它需要大量的转换,就像便携式压缩正确的解决方案一样。您是否尝试使用16位或22位查找表?抱歉,没有回答。不,我没有这样做,因为LUT在架构上实际上是不相关的,没有非常重要的功能
良好的缓存;在x86_64上,您给了我PDEP建议。不过我还是喜欢你。。。顺便问一下,PDEP有一个简单的版本吗?如果你在每一步都需要大量的按位操作,不管缓存是否存在,LUT方法仍然很快。不幸的是,PDEP没有矢量化版本。看见