我正在使用表示无向图的二进制矩阵,并使用gcc的向量扩展来查看如何有效地产生矩阵乘积(用| /&代替+ / *操作)。
以下尝试假定两个输入矩阵都围绕对角线对称:
typedef unsigned char __attribute__((vector_size(8))) vec;
vec example_input = {
0b11001000
, 0b11001001
, 0b00100100
, 0b00010000
, 0b11001000
, 0b00100100
, 0b00000010
, 0b01000001
};
void symmetric_product( const vec& left, const vec& right, vec& result ) {
for( unsigned ii = 0; ii < 8; ++ii ) {
vec tmp{};
// broadcast row ii across all rows
tmp -= 1;
tmp &= left[ii];
// compute first half of dot product of
// all rows in 'right' with row 'ii'
tmp &= right;
// The rest does the 'tallying'; I believe
// the rest could be replaced with the
// pext intrinsic
result[ii] = 0;
for( unsigned jj = 0; jj < 8; ++jj ) {
result[ii] |= (0 != tmp[ii]) << jj;
}
}
}
几个月前,我正在研究类似的东西,以为我看到了一种实现这一目标的巧妙方法,但是现在我发现的只是pext *系列说明。
如果那是唯一的方法,那就这样吧;我的希望是有人知道另一种不需要特定于硬件的内部函数的方法。