2014-11-22 66 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秒。但是,將數據送入循環可能會削減吞吐量。