使用SSE指令优化的数学函数(整理)

float _SSE_cos( float x)
{
 float temp;
 __asm
 {
  movss xmm0, x
  movss xmm1, _ps_am_inv_sign_mask
  andps xmm0, xmm1
  addss xmm0, _ps_am_pi_o_2
  mulss xmm0, _ps_am_2_o_pi

  cvttss2si ecx, xmm0
  movss xmm5, _ps_am_1
  mov  edx, ecx
  shl  edx, (31 - 1)
  cvtsi2ss xmm1, ecx
  and  edx, 0x80000000
  and  ecx, 0x1

  subss xmm0, xmm1
  movss xmm6, _sincos_masks[ecx * 4]
  minss xmm0, xmm5

  movss xmm1, _ps_sincos_p3
  subss xmm5, xmm0

  andps xmm5, xmm6
  movss xmm7, _ps_sincos_p2
  andnps xmm6, xmm0
  mov  temp, edx
  orps xmm5, xmm6
  movss xmm0, xmm5

  mulss xmm5, xmm5
  movss xmm4, _ps_sincos_p1
  movss xmm2, xmm5
  mulss xmm5, xmm1
  movss xmm1, _ps_sincos_p0
  addss xmm5, xmm7
  mulss xmm5, xmm2
  movss xmm3, temp
  addss xmm5, xmm4
  mulss xmm5, xmm2
  orps xmm0, xmm3
  addss xmm5, xmm1
  mulss xmm0, xmm5
 
  movss   x,    xmm0

 }

 return x;
}


float _SSE2_cos(float x) 
{
 __asm
 {
  movss xmm0, x
  movss xmm1, _ps_am_inv_sign_mask
  movss xmm2, _ps_am_pi_o_2
  movss xmm3, _ps_am_2_o_pi
  andps xmm0, xmm1
  addss xmm0, xmm2
  mulss xmm0, xmm3

  pxor xmm3, xmm3
  movd xmm5, _epi32_1
  movss xmm4, _ps_am_1
  cvttps2dq xmm2, xmm0
  pand xmm5, xmm2
  movd xmm1, _epi32_2
  pcmpeqd xmm5, xmm3
  cvtdq2ps xmm6, xmm2
  pand xmm2, xmm1
  pslld xmm2, (31 - 1)

  subss xmm0, xmm6
  movss xmm3, _ps_sincos_p3
  minss xmm0, xmm4
  subss xmm4, xmm0
  andps xmm0, xmm5
  andnps xmm5, xmm4
  orps xmm0, xmm5

  movaps xmm1, xmm0
  movss xmm4, _ps_sincos_p2
  mulss xmm0, xmm0
  movss xmm5, _ps_sincos_p1
  orps xmm1, xmm2
  movaps xmm7, xmm0
  mulss xmm0, xmm3
  movss xmm6, _ps_sincos_p0
  addss xmm0, xmm4
  mulss xmm0, xmm7
  addss xmm0, xmm5
  mulss xmm0, xmm7
  addss xmm0, xmm6
  mulss xmm0, xmm1
  movss   x,    xmm0
 }

 return x;
}

float _SSE_Sqrt(float x)
{

 float root = 0.f;
 _asm
 {
  sqrtss  xmm0, x
  movss  root, xmm0
 }

 return root;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用OpenCV通过SSE指令加速后的函数时,需要将图像数据按照SSE对齐,然后使用加速后的函数进行图像处理。 下面以cv::addWeighted函数为例,介绍如何使用OpenCV通过SSE指令加速后的函数: 1. 将图像数据按照SSE对齐。 可以使用OpenCV提供的函数cv::alignPtr来将指针按照指定字节数对齐,比如按照16字节对齐,代码如下: ```c++ uchar* data1 = image1.data; uchar* data1_align = cv::alignPtr(data1, 16); // 按照16字节对齐 uchar* data2 = image2.data; uchar* data2_align = cv::alignPtr(data2, 16); // 按照16字节对齐 ``` 2. 使用OpenCV通过SSE指令加速后的函数进行图像处理。 在处理图像数据时,可以使用OpenCV通过SSE指令加速后的函数来加速计算。比如,可以使用cv::addWeighted函数来对两幅图像进行加权融合,代码如下: ```c++ cv::Mat image3(image1.rows, image1.cols, image1.type()); cv::addWeighted(image1, 0.5, image2, 0.5, 0.0, image3); ``` 3. 将处理后的数据按照SSE对齐的方式写回到内存中。 在处理完图像数据后,需要将处理后的数据按照SSE对齐的方式写回到内存中。可以使用cv::Mat的data指针来访问数据,并使用_mm_storeu_ps函数来将一个__m128类型的变量中的数据写回到内存中,代码如下: ```c++ uchar* data3 = image3.data; uchar* data3_align = cv::alignPtr(data3, 16); // 按照16字节对齐 __m128i* data_ptr = (__m128i*)data3_align; __m128i* data_end = (__m128i*)(data3_align + image3.rows * image3.cols * image3.channels() / 16 * 16); for (; data_ptr < data_end; data_ptr++) { __m128i data_sse = _mm_loadu_si128(data_ptr); // 使用SSE指令进行图像处理 // ... _mm_storeu_si128(data_ptr, data_sse); } ``` 4. 最后使用_mm_free函数释放内存。 在完成图像处理后,需要使用_mm_free函数来释放按照SSE对齐的内存,代码如下: ```c++ _mm_free(data1_align); _mm_free(data2_align); _mm_free(data3_align); ``` 需要注意的是,使用OpenCV通过SSE指令加速后的函数需要对SSE指令有一定的了解,并且需要对图像处理有一定的掌握。另外,对齐后的数据的内存访问速度会更快,但是会占用更多的内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值