使用 GCC 对大型位向量进行洗牌的最有效方法是什么
what's the most efficient way to shuffle huge bit-vectors using GCC
我有两个非常大的位向量(每个大约 1 GB),我想将它们洗牌以下列方式:
第一个位向量: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 来做到这一点。
你可以尝试滚动自己的循环 --
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 秒。 但是,将数据馈送到循环可能会降低吞吐量。
相关文章:
- 将此布尔值传递给此函数的最有效方法是什么?
- 比较C++中两个整数的最有效和最干净的方法是什么?
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 存储变量的更有效方法是什么?
- 这是什么代码?为什么它有效?C++
- 找到对称矩阵的最大元素的最有效算法是什么
- 传递非泛型函数的最有效方法是什么?
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 是什么使这个以'+'开头的字符串添加成为有效的语句?
- 释放 std::vector 中指针内存的最有效方法是什么?
- 从长(且合理)稀疏向量中选择随机元素的最有效方法是什么?
- 有效创建数字签名的正确方法是什么?我可以使用DSA_sign_setup()吗?
- 填充红黑树的最有效方法是什么?
- 释放分配给大量矢量的内存的最有效方法是什么?
- 在使用 0MQ 异步接收时异步发送数据的最有效方法是什么?
- 在 c++ 中使用右值设置类变量的最有效方法是什么
- 检查字符串是否与可能的输入之一匹配的最有效方法是什么?
- 将随机数放入缓冲区以写入文件的有效方法是什么?
- 从向量中提取最小值、最大值和中位数的最有效方法是什么