繁体   English   中英

64位特定SIMD内部函数

[英]64-bit specific simd intrinsic

我在SSE2中使用以下联合声明。

typedef unsigned long uli;  
typedef uli v4si __attribute__ ((vector_size(16)));  
typedef union  
{  
    v4si v;  
    uli data[2];  
} uliv;  

uliv a, b, c;

想法是给a和b分配两个无符号的长变量(64位长),对它们进行XOR运算并将结果放入c中。

一个显式赋值( a.data[0] = something )在这里有效,但是需要更多时间。

我计划使用内在函数。 如果我使用_mm_set_epi64 (unsigned long x, unsigned long y) ,它将要求__m64变量。 如果我(__m64)x这些变量(__m64)x ,效果很好,但结果却不正确。

for (k = 0; k < 10; k++)  
{  
    simda.v = _mm_set_epi64 (_mulpre1[u1][k], _mulpre2[u2][k]);  
    simdb.v = _mm_set_epi64 (res1[i+k], res2[i+k]);  
    simdc.v = _mm_xor_si128 (simda.v, simdb.v);  
}

上面的代码给出了错误:

/usr/lib/gcc/x86_64-linux-gnu/4.4.3/include/emmintrin.h:578: note: expected ‘__m64’
but argument is of type ‘long unsigned int’

您能否建议一些替代方法(本征)?

确定系统上的unsigned long为64位吗? 使用unsigned long long或更好地使用<stdint.h> uint64_t可能更安全。

在我的系统上, _mm_set_epi64采用两个unsigned long long参数,并返回__m128i

从您的问题尚不清楚,您是否只想(a)对两个64位值进行XOR或(b)对2 x 64位值的两个向量进行XOR?

对于情况(a),只需使用标量代码,例如

uint64_t a, b, c;

c = a ^ b;

对于情况(b),您不需要联合等,只需执行以下操作:

__m128i va, vb, vc;

va = _mm_set_epi64(a1, a2);
vb = _mm_set_epi64(b1, b2);
vc = _mm_xor_si128(va, vb);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM