二进制矩阵向量乘法

时间:2011-06-30 16:31:00

标签: c vector matrix binary-matrix

我想将8x8 二进制矩阵乘以由无符号字符表示的8位向量表示为无符号64位整数。但是,由于一些其他问题,矩阵必须按列排序,因此不容易匹配字节以便于乘法。

知道如何加快这样的计算吗?每项操作都是重要的,我需要进行数十亿次这样的计算。

乘法是在2元素场(F-2)上进行的。

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指令将其有效地打包到结果中。

相关问题