使用向量扩展的快速对称二进制矩阵乘法

时间:2019-02-01 02:26:16

标签: c++ gcc vectorization intrinsics

我正在使用表示无向图的二进制矩阵,并使用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 *系列说明。

如果那是唯一的方法,那就这样吧;我的希望是有人知道另一种不需要特定于硬件的内部函数的方法。

0 个答案:

没有答案