我想将8x8 二进制矩阵乘以由无符号字符表示的8位向量表示为无符号64位整数。但是,由于一些其他问题,矩阵必须按列排序,因此不容易匹配字节以便于乘法。
知道如何加快这样的计算吗?每项操作都是重要的,我需要进行数十亿次这样的计算。
乘法是在2元素场(F-2)上进行的。
答案 0 :(得分:7)
使用这种矩阵和向量表示,有助于以这种方式进行矩阵乘法:
(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次然后计算P = A & v_inflated
将8位向量扩展到64位向量,则可以立即进行所有乘法运算。唯一剩下的就是产品的添加(即异或)。
对产品进行异或的简单方法是。
uint64_t P = calculated products from text above;
uint64_t sum = 0;
for( int i = 8; i; --i )
{
sum ^= P & 0xFF;
P >> 8;
}
答案 1 :(得分:5)
你只有256个载体!使用查找表生成正确的位掩码,然后您的逻辑将类似于
output_bit_n = bool (matrix [n] & lookup [vector])
换句话说,您的查找表可以将8位值转换为64位世界。
如果编译器不够智能以优化(value<<=1)|=result
,您可以使用rotate-with-carry指令将其有效地打包到结果中。