(资料图)
数据类型,例如cv::v_int8x16 表示int8_t的基本数据,16个。即类型在前,数量在后。
CV_SIMD_WIDTH是一个宏定义,用于表示在OpenCV中使用的向量化数据类型的宽度。它表示一个向量中包含的元素数量。
基本数据类型
cv::v_uint8 /cv::v_int8 cv::v_uint16 /cv::v_int6 cv::v_uint32 /cv::v_int32 cv::v_uint64 /cv::v_int64 cv::v_float32cv::v_float64
根据寄存器位数来分类,128位:cv::v_uint8x16/cv::v_int8x16cv::v_uint16x8/cv::v_int16x8cv::v_uint32x4/cv::v_int32x4cv::v_uint64x2/cv::v_int64x2cv::v_float32x4cv::v_float64x2
根据寄存器位数来分类,256位:(需要注意的是 要判断是否满足512bit的情况 例如CV_SIMD256)cv::v_uint8x32/cv::v_int8x32cv::v_uint16x16/cv::v_int16x16cv::v_uint32x8/cv::v_int32x8cv::v_uint64x4/cv::v_int64x4cv::v_float64x4
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;}