C++ 如何使用特征库计算uint8_t阵列的点积?

C++ 如何使用特征库计算uint8_t阵列的点积?,c++,eigen,dot-product,C++,Eigen,Dot Product,我想计算C/C++中两个uint8类型数组的dotproduct,naive实现为: uint64\u t dotproduct\u u8\u naive(uint8\u t*a、uint8\u t*b、uint32\u t len) { uint64_t res=0; 对于(uint32\u t i=0;i什么是uint8\u t的两个向量的乘积的返回类型?如果它是uint8\u t,那么它就不可能工作。此外,编译器应该能够对简单的乘积进行向量化。它不会对浮点/双精度的点积进行向量化,因为这取

我想计算C/C++中两个uint8类型数组的dotproduct,naive实现为:

uint64\u t dotproduct\u u8\u naive(uint8\u t*a、uint8\u t*b、uint32\u t len)
{
uint64_t res=0;

对于(uint32\u t i=0;i什么是
uint8\u t
的两个向量的乘积的返回类型?如果它是
uint8\u t
,那么它就不可能工作。此外,编译器应该能够对简单的乘积进行向量化。它不会对浮点/双精度的点积进行向量化,因为这取决于操作顺序。@ALX23z i t想象一下
uint8\u t
的两个向量的乘积的返回类型应该是
uint64\u t
。也许这是不正确的;但是,尝试只返回cout result,忽略显式声明返回类型,即
std::cout问题不是它应该是什么-问题是返回类型是什么。您可以测试返回什么类型。尝试
 uint64\u t res=va.cast().dot(vb.cast())
这可能仍然不如本机循环有效,但应该比上一个选项快得多。一般来说,对于混合类型表达式,Egeng不是很有效,但。@chtz感谢提供此选项。在我的Android ARMv8手机上测试,时间成本几乎与naive实现相同(元素方面),比我上一个备选方案快近20倍。
uint64_t dotproduct_u8_eigen(uint8_t* a, uint8_t* b, uint32_t len)
{
    Eigen::Map<Eigen::Matrix<uint8_t, 1, Eigen::Dynamic, Eigen::RowMajor>> va(a, len);
    Eigen::Map<Eigen::Matrix<uint8_t, 1, Eigen::Dynamic, Eigen::RowMajor>> vb(b, len);
    
    Eigen::Matrix<uint64_t, 1, Eigen::Dynamic, Eigen::RowMajor> fa = va.cast<uint64_t>();
    Eigen::Matrix<uint64_t, 1, Eigen::Dynamic, Eigen::RowMajor> fb = vb.cast<uint64_t>();

    return fa.dot(fb);
}