Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';这是使用GCC洗牌巨大位向量的最有效方法_C++_Performance_Vectorization - Fatal编程技术网

C++ 什么';这是使用GCC洗牌巨大位向量的最有效方法

C++ 什么';这是使用GCC洗牌巨大位向量的最有效方法,c++,performance,vectorization,C++,Performance,Vectorization,我有两个非常大的位向量(每个大约1GB),我想洗牌它们 以下列方式: 第一位向量: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来实现这一点 你可以试着自己循环-- intch1,ch2; 而((ch1=fgetc(fp1))!=EOF&&(ch2=fgetc(fp2))!=EOF)

我有两个非常大的位向量(每个大约1GB),我想洗牌它们 以下列方式:

第一位向量:
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来实现这一点

你可以试着自己循环--

intch1,ch2;
而((ch1=fgetc(fp1))!=EOF&&(ch2=fgetc(fp2))!=EOF){
int i,dst=0;
//假设msb先行
对于(i=7;i>=0;i--){

dst |=(ch1&(1)您尝试过什么?为什么使用两个
std::vector
的简单循环还不够?所以您需要制作第三个向量来存储
a
b
的混洗?为什么不使用位集而不是位向量,它们更快。@AlexandreC。我做了这个循环,但速度太慢了。我没有尝试更多(我是数学家)。我正在阅读新英特尔处理器的指令集手册,我知道可以执行高性能位向量洗牌操作,但我不知道如何使用GCC实现。非常感谢!这是一个非常好的问题。以下是“标准”解决方案:-但是,这些都没有使用新的奇特的向量扩展,因此它们并不能真正回答您的问题。
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);
}