opencv之SIMD

发布时间 2023-08-29 14:26:00作者: 弘道者

数据类型,例如cv::v_int8x16 表示int8_t的基本数据,16个。即类型在前,数量在后。

CV_SIMD_WIDTH是一个宏定义,用于表示在OpenCV中使用的向量化数据类型的宽度。它表示一个向量中包含的元素数量。

cv::vx_load是一个通用的向量加载函数,潜在的意思是加载尽可能大的数据

cv::v_load是一个特定于OpenCV向量化数据类型的加载函数。它用于加载特定长度的向量数据,该长度由向量化数据类型的宽度(CV_SIMD_WIDTH)决定

下面是一个求和的示例

int add_opencv(uint8_t* data, int wid, int hei) {
    int total = 0;
    int size = wid * hei;
    //CV_SIMD_WIDTH
    // 使用128位寄存器进行SIMD计算
    cv::v_int8x16 sum =cv::v_setzero_s8();// _mm_setzero_si128();

    // 每次处理16个元素(8位)
    for (int i = 0; i < size; i += 16) {
        // 从内存加载16个元素到128位寄存器
        cv::v_int8x16 cur=cv::v_load((const int8_t*)(data+i));
        // 求和
        sum = cv::v_add_wrap(sum, cur);
    }
    total=cv::v_reduce_sum(sum);
    // 处理剩余的元素(不足16个)
    for (int i = size - (size % 16); i < size; ++i) {
        total += data[i];
    }
    
    return total;
}