使用SSE将C中32位整数的两个向量相乘的最快方法

使用SSE将C中32位整数的两个向量相乘的最快方法,第1张

概述我有两个无符号向量,大小都是4 vector<unsigned> v1 = {2, 4, 6, 8}vector<unsigned> v2 = {1, 10, 11, 13} 现在我想将这两个向量相乘并获得一个新向量 vector<unsigned> v_result = {2*1, 4*10, 6*11, 8*13} 什么是SSE *** 作?它是跨平台还是仅跨平台 在某些指定的平台? 添加: 如果我 我有两个无符号向量,大小都是4

vector<unsigned> v1 = {2,4,6,8}vector<unsigned> v2 = {1,10,11,13}

现在我想将这两个向量相乘并获得一个新向量

vector<unsigned> v_result = {2*1,4*10,6*11,8*13}

什么是SSE *** 作?它是跨平台还是仅跨平台
在某些指定的平台?

添加:
如果我的目标是增加不是乘法,我可以超级快速地做到这一点:

__m128i a = _mm_set_epi32(1,2,3,4);__m128i b = _mm_set_epi32(1,4);__m128i c;c = _mm_add_epi32(a,b);
解决方法 对所有元素使用集合内在函数(如_mm_set_epi32)效率很低.最好使用load intrinsics.有关该 Where does the SSE instructions outperform normal instructions的更多信息,请参阅此讨论.如果数组是16字节对齐,您可以使用_mm_load_si128或_mm_loadu_si128(对于对齐的内存,它们具有几乎相同的效率),否则使用_mm_loadu_si128.但是对齐的内存效率要高得多.为了获得对齐的内存,我建议_mm_malloc和_mm_free,或C11 aligned_alloc,这样你就可以正常使用了.

为了回答你的其余问题,我们假设你在SSE寄存器中加载了两个向量__m128i a和__m128i b

对于SSE版本> = SSE4.1使用

_mm_mullo_epi32(a,b);

没有SSE4.1:

此代码复制自Agner Fog的Vector Class Library(并且被此答案的原作者抄袭):

// Vec4i operator * (Vec4i const & a,Vec4i const & b) {// #ifdef__m128i a13    = _mm_shuffle_epi32(a,0xF5);          // (-,a3,-,a1)__m128i b13    = _mm_shuffle_epi32(b,b3,b1)__m128i prod02 = _mm_mul_epu32(a,b);                 // (-,a2*b2,a0*b0)__m128i prod13 = _mm_mul_epu32(a13,b13);             // (-,a3*b3,a1*b1)__m128i prod01 = _mm_unpacklo_epi32(prod02,prod13);   // (-,a1*b1,a0*b0) __m128i prod23 = _mm_unpackhi_epi32(prod02,a2*b2) __m128i prod   = _mm_unpacklo_epi64(prod01,prod23);   // (ab3,ab2,ab1,ab0)
总结

以上是内存溢出为你收集整理的使用SSE将C中32位整数的两个向量相乘的最快方法全部内容,希望文章能够帮你解决使用SSE将C中32位整数的两个向量相乘的最快方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1215173.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存