2014-11-22 65 views
4

洗牌巨大位向量的最有效的方式,我有两个非常大的位向量(约1 GB每个),我想打乱他们 以下列方式:什么是使用GCC

第一比特矢量:a[0], a[1], a[n]
第二位向量:b[0], b[1], b[n]

应该导致这样的:

c[0] = a[0] 
c[1] = b[0] 
c[2] = a[1] 
c[3] = b[1] 

什么是最有效的方式做,在C + +,使用新的英特尔处理器的矢量操作?我想用GCC来做到这一点。

+0

你有什么试过?为什么使用两个'std :: vector '的天真循环还不够? – 2014-11-22 11:24:25

+0

所以你需要制作第三个存储“a”和“b”混洗的向量? – edmz 2014-11-22 11:24:54

+0

为什么不使用位向量而不是位向量,它们更快。 – Aleksandar 2014-11-22 11:29:28

回答

0

你可以尝试滚动自己环路 -

int ch1, ch2; 
while ((ch1 = fgetc(fp1)) != EOF && (ch2 = fgetc(fp2)) != EOF) { 
    int i, dst = 0; 
    // assuming msb goes first 
    for (i=7; i>=0; i--) { 
     dst |= (ch1 & (1<<i)) << (2*i + 1); 
     dst |= (ch2 & (1<<i)) << (2*i + 0); 
    } 
    putc(dst >> 8); 
    putc(dst & 0xFF); 
} 

可以按摩这一点,把它打开,预取块为局部数组,过程中环路16位,但它在交错的两个位每个源位4个指令中的字节(-O3展开了循环)。

如果我们假设两个字节在3GHz处理器上占用150个周期,那么从2x20 MB /秒源数据读取输出为40 MB /秒,或者对于2x1000 MB为50秒。但是,将数据送入循环可能会削减吞吐量。