【问题标题】:How to load two sets of 4 shorts into an XMM register?如何将两组 4 个短裤加载到 XMM 寄存器中?
【发布时间】:2013-04-20 01:40:26
【问题描述】:

我刚刚开始使用 Visual C++ 2012 使用 SSE 内在函数,我需要一些指针(不是双关语)。

我有两个数组,每个数组包含 4 个 signed shorts(因此每个数组都是 64 位的,总共 128 个)。我想将一个加载到 XMM 寄存器的高位,另一个加载到低位。我可以使用 SSE 内在函数有效地完成此任务吗?如果有,怎么做?

【问题讨论】:

  • 我猜是这样,但如果可能的话,我宁愿使用可用的内在函数而不是直接编写指令。

标签: c++ x86 sse simd intrinsics


【解决方案1】:

SSE2:

short A[] = {0,1,2,3};
short B[] = {4,5,6,7};

__m128i a,b,v;
a = _mm_loadl_epi64((const __m128i*)A);
b = _mm_loadl_epi64((const __m128i*)B);
v = _mm_unpacklo_epi64(a,b);

// v = {0,1,2,3,4,5,6,7}

SSE4.1 + x64:

short A[] = {0,1,2,3};
short B[] = {4,5,6,7};

__m128i v;
v = _mm_loadl_epi64((const __m128i*)A);
v = _mm_insert_epi64(v,*(const long long*)B,1);

// v = {0,1,2,3,4,5,6,7}

请注意,AB 没有对齐要求。但我还是建议它们都对齐到 8 个字节。

【讨论】:

  • Weee 我教了大师一些东西(开玩笑的)。非常感谢!
  • 当我被所有新事物宠坏时,就会发生这种情况。我失去了与旧事物的联系。 :)
  • @0x499602D2 “单词”有很多不同的定义。在 x86 汇编中,一个字是 16 位。在计算机体系结构中,一个“词”通常是硬件的“自然工作大小”。所以 32 位硬件将有一个 32 位字。 64 位硬件将有一个 64 位字。
  • 至少在gcc 中,编译器处理__m128i v = _mm_unpacklo_epi64(*(__m128i*)A, *(__m128i*)B); 并将其转换为两个指令序列movdqu ...,%xmm0; punpcklqdq ...,%xmm0... 一个内存操作数,即与SSE4 几乎相同。 1个; SSE2 不是严格正确的,因为它在加载时超出了输入(如果两个数组中的任何一个在页面边界处结束,则可能会出现段错误),但它的指令少于两个 movq 加上 punpcklqdq。如果您的 short 数组充分对齐并且已知不会跨越页面边界,那么它将起作用。
  • @plasmacel _mm_insert_epi64() 内在/指令在 x86 中不存在。
猜你喜欢
  • 2016-08-02
  • 2011-01-14
  • 2019-04-28
  • 2012-06-28
  • 2019-11-16
  • 1970-01-01
  • 2016-12-25
  • 2020-05-07
相关资源
最近更新 更多