我想将表示为无符号 64 位整数的 8x8二进制矩阵乘以由无符号字符表示的 8 位向量。但是,由于其他一些问题,矩阵必须按列排序,因此没有简单的字节匹配以便于乘法。
知道如何加快这样的计算吗?每个操作都很重要,因为我需要进行数十亿次这样的计算。
乘法是在一个 2 元素字段 (F-2) 上进行的。
我想将表示为无符号 64 位整数的 8x8二进制矩阵乘以由无符号字符表示的 8 位向量。但是,由于其他一些问题,矩阵必须按列排序,因此没有简单的字节匹配以便于乘法。
知道如何加快这样的计算吗?每个操作都很重要,因为我需要进行数十亿次这样的计算。
乘法是在一个 2 元素字段 (F-2) 上进行的。
使用这种矩阵和向量表示,它有助于以这种方式进行矩阵乘法:
(col 1 ... col 8 ) * (v 1 ... v 8 ) T = col 1 * v 1 + ... + col 8 * v 8
其中矩阵 A = (col 1 ... col 8 )
和列向量 v = (v 1 ... v 8 ) T
进一步考虑,如果通过重复每个位 8 次然后计算 8 位向量将 8 位向量膨胀为 64 位向量,则可以一次进行所有乘法运算P = A & v_inflated
。剩下的唯一事情就是产品的加法(即XOR)。
对产品进行异或的一种简单方法是。
uint64_t P = calculated products from text above;
uint64_t sum = 0;
for( int i = 8; i; --i )
{
sum ^= P & 0xFF;
P >> 8;
}
你只有 256 个向量!使用查找表生成正确的位掩码,然后您的逻辑将类似于
output_bit_n = bool (matrix [n] & lookup [vector])
换句话说,您的查找表可以将 8 位值转换为 64 位世界。
如果编译器不够聪明,无法优化,您可以使用带有旋转进位的指令有效地将其打包到结果中(value<<=1)|=result
。