1

我在 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 位长),对它们进行异或并将结果放在 c 中。

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

我打算使用内在函数。如果我使用_mm_set_epi64 (unsigned long x, unsigned long y),它会要求__m64变量。如果我转换这些变量(__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’

您能否建议一些替代方案(内在)?

4

1 回答 1

1

确定你的unsigned long系统是64位的吗?使用它可能更安全,unsigned long long或者uint64_t<stdint.h>.

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

从您的问题中不清楚您是否只想(a)异或两个 64 位值或(b)异或两个 2 x 64 位值的向量?

对于情况 (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);
于 2010-12-08T17:10:57.840 回答