大佬教程收集整理的这篇文章主要介绍了c – 对于具有所有相同组件的SSE向量,可以动态生成还是预先计算?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在预先计算非常重要和高度使用的向量,并在运行中生成那些不太重要的向量.但我真的通过预先计算获得了任何速度吗?这值得吗?
_mm_set1_ps是用单个指令实现的吗?这可能会回答我的问题.
__m128 calc_set1(float num1,float num2) { __m128 num1_4 = _mm_set1_ps(num1); __m128 num2_4 = _mm_set1_ps(num2); __m128 result4 = _mm_mul_ps(num1_4,num2_4); return result4; } __m128 calc_mov(float* num1_4_addr,float* num2_4_addr) { __m128 num1_4 = _mm_load_ps(num1_4_addr); __m128 num2_4 = _mm_load_ps(num2_4_addr); __m128 result4 = _mm_mul_ps(num1_4,num2_4); return result4; }
和装配
calc_set1(float,float): shufps $0,%xmm0,%xmm0 shufps $0,%xmm1,%xmm1 mulps %xmm1,%xmm0 ret calc_mov(float*,float*): movaps (%rdi),%xmm0 mulps (%rsi),%xmm0 ret
您可以看到calc_mov()按照您的预期执行,calc_set1()使用单个shuffle指令.
如果在高速缓存未命中的罕见事件中L1高速缓存的加载端口更忙,则movps指令可以花费大约四个周期来生成更多地址.
shufps将在最近的任何英特尔微体系结构上进行一个周期.无论是SSE128还是AVX256,我都相信这是真的.因此我建议使用mm_set1_ps方法.
当然,shuffle指令假定float已经在SSE / AVX寄存器中.如果您从内存加载它,那么广播将更好,因为它将在单个指令中捕获最好的movps和shufps.
以上是大佬教程为你收集整理的c – 对于具有所有相同组件的SSE向量,可以动态生成还是预先计算?全部内容,希望文章能够帮你解决c – 对于具有所有相同组件的SSE向量,可以动态生成还是预先计算?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。